我想选择数据表(DT1
)的特定行值(此处为TARGET
),其中过滤条件位于其他数据表(DT2
)中。它不是一个精确的过滤器,因为如果我在DT2
中有值3,我在DT1
中就有这个值的最小值和最大值变量。此外,我有一个字符串,其中包含特定的模式。例如:DT2
中的 A = 3
和 DT1
中的相应行包含 minA = 3
,maxA = 6
和 C = “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:
我认为,我有一个比这些问题更复杂的过滤器:
预先感谢任何帮助。
新解决方案
我意识到浏览大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位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。