在R中对data.table进行编程子集处理

5

这似乎是个非常简单的问题,但是它的解决方案已经使我尝试、搜索和阅读手册和在线资料约90分钟了。

假设我有一个data.table:

DT<-data.table(a=runif(n = 10),b=runif(n = 10),c=runif(n = 10))

显然,像这样的东西起作用:

DT[a > 0.5]

并给我一个DT子集,其中列“a”中的值大于0.5。但如果我想要更加灵活一些呢(因为子集嵌入在一个更大的例程中)。

我想要做的是使这个原型函数起作用:

flexSubset<-function(sColumnToSubset,dMin){
subs<-DT[sColumnToSubset>dMin]
return(subs)
}

我尝试过很多方法,但都没有成功…

with=FALSE

有什么建议吗?非常感谢您提前花费的时间!

1
我猜 DT[eval(parse(text=sColumnToSubset))<dMin] 可以工作,但我相信会有更好的解决方案。 - nicola
1个回答

8
如果您想传递一个字符串,请按照以下步骤操作:
flexSubset = function(sColumnToSubset, dMin)
                DT[get(sColumnToSubset) > dMin]

flexSubset("a", 0.5)

如果你想传递一个未经评估的表达式,则需要:
flexSubset = function(sColumnToSubset, dMin) {
                lhs = substitute(sColumnToSubset)
                DT[eval(lhs) > dMin]
             }

flexSubset(a, 0.5)
flexSubset(a / b, 0.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接