R 根据列条件以编程方式从Data.table中选择行

R 根据列条件以编程方式从Data.table中选择行,r,data.table,R,Data.table,我有一个关于如何根据列中的值以编程方式从data.table中选择行的问题 假设我有下面的数据 library(data.table) DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 但在我的例子中,这样的选择标准本身就是一个变量,放在不同的DF中 在这种情况下,上面X2的值将发生变化,即使行数也是可变的,即假设我有一个更大的DT和更多的列,DF中的一些额外行可能会基于DF的生成标准 是否有任何方法可以使

我有一个关于如何根据列中的值以编程方式从data.table中选择行的问题

假设我有下面的数据

library(data.table)
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
但在我的例子中,这样的选择标准本身就是一个变量,放在不同的DF中

在这种情况下,上面X2的值将发生变化,即使行数也是可变的,即假设我有一个更大的DT和更多的列,DF中的一些额外行可能会基于DF的生成标准

是否有任何方法可以使用DF以编程方式选择DT中的行

一个选项是通过粘贴“DF”的列来创建表达式来进行求值

DT[eval(parse(text= paste(DF$X1, DF$X2,  sep="==", collapse=" & ")))]
#   x y v
#1: a 3 2
或者,我们可以将.SDcols指定为“X1”列,然后将.SD与“X2”进行比较,并将其减少为带有&、子集行的逻辑向量

DT[DT[, Reduce(`&`, Map(`==`, .SD, DF$X2)),.SDcols = as.character(DF$X1)]]
#   x y v
#1: a 3 2
一个选项是通过粘贴“DF”的列来创建表达式来求值

DT[eval(parse(text= paste(DF$X1, DF$X2,  sep="==", collapse=" & ")))]
#   x y v
#1: a 3 2
或者,我们可以将.SDcols指定为“X1”列,然后将.SD与“X2”进行比较,并将其减少为带有&、子集行的逻辑向量

DT[DT[, Reduce(`&`, Map(`==`, .SD, DF$X2)),.SDcols = as.character(DF$X1)]]
#   x y v
#1: a 3 2
使用联接的另一个选项:

使用联接的另一个选项:


很好,但需要先将X1转换为字符。setNamesas.listDF$X2,DF$X1可以代替structureas.listDF$X2,names=DF$X1oh我想我总是有选择StringsAsAffactors=false,但需要先将X1转换为字符。setNamesas.listDF$X2,DF$X1可以代替structureas.listDF$X2,names=DF$X1哦,我想我总是可以选择StringsAsAffactors=FALSE
DT[structure(as.list(DF$X2), names=DF$X1), on=as.character(DF$X1)]