说我有2个data.table集,
DT1 <- data.table(x=1L, y=2L, z=3L)
DT2 <- data.table(x=1:3L, y=2:4L, z=3:5L)
B <- DT2[x==1 & y == 2 & z == 3]
identical(DT1, B) # TRUE
我可以做类似DT2[c(x,y,z) == DT1]
的事情并得到结果吗?
假设在有很多条件要比较时,它应该比DT2[x==1 & y == 2 & z == 3]
更优雅。请告知。
感谢Akrun&Michael。 我正在寻找的是j中的比较表达式。另一个玩具的例子在这里。
minDT <- data.table(x=1L, y=1L, z=1L) # side-finding:
maxDT <- data.table(x=3L, y=3L, z=3L) # i noticed it would be numeric if not L
aimDT <- data.table(x=1:3, y=1:3, z=1:3) # in this case, the value is integer
我正在尝试是否可以一次全部比较,而不必
aimDT[x>1 & x<3 & y>1 & y<3 & z>1 & z<3]
,而是像
aimDT[c(x,y,z)> minDT][c(x,y,z)<maxDT]
谢谢。
答案 0 :(得分:2)
如果我们要比较“ DT2”和“ DT2”的相应列,请使用Map
和Reduce
将其与逻辑vector
和&
进行比较设置“ DT2”的行
DT2[DT2[, Reduce(`&`, Map(`==`, .SD, DT1))]]
# x y z
#1: 1 2 3
或使用setkey
设置键,并使用'DT1'值设置子行
setkeyv(DT2, names(DT2))
DT2[DT1]
# or unkeyed, safer against columns being out of order
DT2[DT1, on=names(DT1)]