当前位置: 首页 > 知识库问答 >
问题:

选择数据表中由其他数据表中的筛选器给出的行

山疏珂
2023-03-14

我想选择数据表(DT1)的特定行值(此处为TARGET),其中过滤条件位于其他数据表(DT2)中。它不是一个精确的过滤器,因为如果我在DT2中有值3,我在DT1中就有这个值的最小值和最大值变量。此外,我有一个字符串,其中包含特定的模式。例如:DT2 中的 A = 3DT1 中的相应行包含 minA = 3maxA = 6C = “Mon”,即 C = “星期一,星期二”

DT1
    INDEX1 minA maxA       C TARGET
9 :      9    3    6 Mon,Tue    109

DT2
   A   C INDEX2
1: 3 Mon      1

我在寻找这个值所在的范围和最大目标值的直线。

我有以下简化的例子:

# version 1.9.6
library(data.table)

DT1 <- data.table(INDEX1 = 1:12,
                  minA = c(1,1,1,2,2,2,3,3,3,4,4,4),
                  maxA = c(4,5,6),
                  C = c("Mon,Tue", "Mon,Wed", "Tue,Thu", "Wed,Thu"),
                  TARGET = c(101:112))
size <- 2
DT2 <- data.table(A = rep(c(3,4), size),
                  C = rep(c("Mon", "Thu"), size),
                  INDEX2 = 1:(2*size))

看起来像这样:

DT1
   INDEX1 minA maxA       C TARGET
1 :      1    1    4 Mon,Tue    101
2 :      2    1    5 Mon,Wed    102
3 :      3    1    6 Tue,Thu    103
4 :      4    2    4 Wed,Thu    104
5 :      5    2    5 Mon,Tue    105
6 :      6    2    6 Mon,Wed    106
7 :      7    3    4 Tue,Thu    107
8 :      8    3    5 Wed,Thu    108
9 :      9    3    6 Mon,Tue    109
10:     10    4    4 Mon,Wed    110
11:     11    4    5 Tue,Thu    111
12:     12    4    6 Wed,Thu    112

DT2
   A   C INDEX2
1: 3 Mon      1
2: 4 Thu      2

我包括<code>大小

到目前为止,我的解决方案如下:

我写了一个函数foo(),它接受过滤器输入值并返回DT1的索引(或其他更有用的变量)。

foo <- function(i.A, i.C){
  DT1[INDEX1 %in% grep(i.C,C) & minA <= i.A & maxA >= i.A,][TARGET == max(TARGET),]
}

我为DT2的每一行调用这个函数

DT2[, foo(i.A = A, i.C = C), by = INDEX2]

与Outout:

   INDEX2 INDEX1 minA maxA       C TARGET
1:      1      9    3    6 Mon,Tue    109
2:      2     12    4    6 Wed,Thu    112

我的问题是:

这适用于小型数据表,但我在DT2中有更多的行。这些功能需要更长的时间,我想知道是否有更好/更快的方法来进行这种过滤?也许可以“升级”foo(),以便它可以处理整个列而不是单行?

如果可能的话,我希望避免像这样扩展我的DT1:

  • R:选择数据表中的特定行

我认为,我有一个比这些问题更复杂的过滤器:

    < li >如何根据一个数据表中定义的多个条件筛选另一个数据表中的案例 < li>R:根据一个数据表有效地选择另一个数据表中的指定行?

预先感谢任何帮助。

共有1个答案

松正阳
2023-03-14

新解决方案

我意识到浏览大data.table的每一行需要很多时间,所以我构建了一个新的函数foo_new,它反过来工作:

foo_new <- function(data, i.A, i.C){
  data[C %in% i.C & A %between% i.A, INDEX2]
}

我没有用DT1行切削DT2的每一行,而是选择DT2中与DT1一行的值匹配的每一行。完成DT2的排序是因为我需要具有最高TARGET值的行。此外,如果已经选择了DT2中的一行,则会在下一次迭代中删除它。

整个过程加快了很多:

   function   user  system elapsed 
   foo      61.511   0.327  62.052
   foo_new   0.045   0.003   0.047 

这可能是唯一的情况,当DT1小于DT2时,这就是我的情况。

这是我的整个模拟代码:

rm(list = ls())
library(data.table)

DT1 <- data.table(INDEX1 = 1:12,
                  minA = c(1,1,1,2,2,2,3,3,3,4,4,4),
                  maxA = c(4,5,6),
                  C = c("Mon,Tue", "Mon,Wed", "Tue,Thu", "Wed,Thu"),
                  TARGET = c(101:112))

size <- 20000
DT2 <- data.table(A = rep(c(3,4), size),
                  C = rep(c("Mon", "Thu"), size),
                  INDEX2 = 1:(2*size))

foo <- function(i.A, i.C){
  DT1[INDEX1 %in% grep(i.C, C) &
        minA <= i.A &
        maxA >= i.A,
      ][TARGET == max(TARGET),]
}

foo_new <- function(data, i.A, i.C){
  data[C %in% i.C & A %between% i.A, INDEX2]
}

# with foo
DT2[, foo(i.A = A, i.C = C), by = INDEX2])

# with foo_new
DT1.ordered <- copy(DT1[order(TARGET, decreasing = TRUE)])
tmp.index <- list()
DT2[, TARGET := as.numeric(NA)]
for (i in c(1:dim(DT1.ordered)[1])) {
  # i <- 1
  restdata <- copy(DT2[is.na(TARGET),])
  tmp.index <- foo_new(data = restdata,
                       i.A  = unlist(DT1.ordered[i, list(minA, maxA)]),
                       i.C  = DT1.ordered[i, strsplit(C, ",")[[1]]])
  DT2[INDEX2 %in% tmp.index, TARGET := DT1.ordered[i, TARGET]]
}
 类似资料:
  • 问题内容: 具有下表(): 另一个帮助表(): 我正在寻找一个SQL查询来输出以下内容: 所以,每一次是和是 在 响应表, 汇总 对话上下文到这一点,忽略不池中的响应结束谈话的一部分。 在上面的示例中,活动 响应文本 为1中的 3 。 我尝试了以下复杂的SQL,但有时会中断将文本汇总错误的情况: 我敢肯定有更好的方法。 问题答案: 这是我的看法: 这将扫描表一次,但是我不确定它的性能是否会比您的解

  • 我有一个在data.table中选择行的特定问题,到目前为止还没有设法解决它。我有一个数据集,用于存储一系列参数的仿真结果。数据集中的列包含参数或结果值,请参阅下面的代码(“p”表示参数列,“v”表示值列。 我现在想提取:对于每个p1,对于给定的p2和p3值,对于p4,p5的任意值,v1的值是最小的行。设 np4 和 np5 是 p4 和 p5 的唯一值的数量,对于每个唯一的 p1 并给定 p2,

  • 问题内容: 如何编写SQL语句从三个表中选择数据? 问题答案: 使用联接 这将要求每个表都有一个table_1_id键,并且每个表中都有一个条目。 如果table_2或table_3可能没有数据,但您仍想显示来自table_1的数据,则可以使用LEFT JOIN

  • 我正在使用Primefaces 3.5数据表。该表已启用多重选择模式。基本上,该表与[本次展示][1]中的最后一个表相同。表的定义如下 因此,当用户通过单击复选框选择一些行,然后意外地单击一行时,除了用户最后单击的那一行之外,所有选中的行都将被取消选中。 问题是:是否有任何解决方法来维护选中的行,即使用户将单击该行的“退出”复选框? 我的一些观察: 如果用户按Ctrl键并单击该行,则所有其他行都将

  • 问题内容: 我有两个postgresql表: 我想获取其中没有一行的每个IP地址。 我尝试了此查询,但它引发了语法错误。 我也想知道此查询(进行调整以使其工作)是否是为此目的性能最佳的查询。 问题答案: 基本上有4种技术可以完成此任务,所有这些技术都是标准SQL。 在Postgres中通常最快。 [](https://www.postgresql.org/docs/current/queries-

  • 我有两个postgresql表: 我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。