使用data.table
library(data.table)
dd <- data.table(x=1:10,y=10:1,z=20:20)
我可以使用过滤器来筛选它。
dd[x %in% c(1, 3) & z %in% c(12, 20)]
x y z
1: 1 10 20
2: 3 8 20
现在我想动态创建相同的过滤器。目前为止,我尝试了以下方法:
cond <- list(x=c(1,3),z=c(12,20))
vars <- names(cond)
## dd[get(vars[[1]]) %in% cond[[1]] & get(vars[[2]]) %in% cond[[2]]]
EVAL = function(...){
expr <- parse(text=paste0(...))
print(expr)
eval(expr)
}
dd[ EVAL(vars, " %in% ", cond, collapse=" & ") ]
但我仍然收到一个错误提示:
Error in match(x, table, nomatch = 0L) : object 'x' not found
即使表达式的结果看起来不错:
expression(x %in% c(1, 3) & z %in% c(12, 20))
有没有办法修复这个问题?
EVAL = function(x, vars, cond){ setkeyv(x, vars) ; x[do.call(CJ, cond), nomatch = 0L] } ; EVAL(dd, vars, cond)
。 - David Arenburgdd[rowSums(mapply(\
%in%`, dd[names(cond)], cond)) == length(cond), ]` 进行翻译。 - rawrcond
的每个元素取笛卡尔积,然后连接结果:dd[do.call(CJ,cond), on=names(cond), nomatch=0]
(哦,我看到 David 在上面发表了类似的内容)。 - Frank