data.table
是一个很棒的R包,我正在开发的库中使用它。到目前为止,一切都很顺利,除了一个并发症。使用保存在变量中的名称引用data.table
列似乎要困难得多(与传统的 Dataframe 相比)(例如,对于 Dataframe 将是:colname="col"; df[df[,colname]<5,colname]=0
)。
也许最复杂的事情是data.table
中明显缺乏语法一致性。在某些情况下,eval(colname)
和get(colname)
,甚至c(colname)
似乎可以工作。在其他情况下,DT[,colname, with=F]
是解决方案。然而,在其他函数中,例如set()
和subset()
函数,我根本没有找到解决方案。最后,前面讨论了一个极端的,尽管也很常见的用例(passing column names to data.table programmatically),提出的解决方案,尽管显然在做他们的工作,但似乎不是特别可读。
也许我把事情弄得太复杂了。如果任何人都能在不同的常见场景中使用变量引用data.table
列名,我将非常感激。
更新:
一些具体的例子,工作提供了我可以硬编码列名:
x.short = subset(x, abs(dist)<=100)
set(x, which(x$val<10), "val", 0)
现在假设distcol="dist"
,valcol="val"
。使用distcol
和valcol
而不是dist
和val
执行上述操作的最佳方法是什么?
5条答案
按热度按时间0yycz8jy1#
如果你要在
j
表达式中进行复杂的操作,你可能应该使用eval
和quote
。在当前版本的data.table
中,一个问题是eval
的环境并不总是正确处理-eval and quote in data.table(注意:基于对软件包的更新,对该答案进行了更新。)-当前的修复方法是将.SD
添加到eval
。据我所知,从一些测试,我已经运行,这并不影响速度(的方式,例如。在j
中具有.SD[1]
将)。有趣的是,这个问题只困扰
j
,你可以在i
中正常使用eval
(其中.SD
无论如何都不可用)。另一个问题是赋值,你必须有字符串。我知道一种从带引号的表达式中提取字符串名称的方法--它并不漂亮,但很有效。下面是一个将所有内容组合在一起的示例:
请注意,我没有在一个
eval(distcol)
中添加.SD
是可以的,但如果我将它从另一个eval
中取出,就不会了。另一种选择是使用
get
:hi3rlvi22#
也许你已经知道这个解决方案了。
这是受到@eddi在下面评论中的解决方案的启发,使用OP的例子:
mrwjdhj33#
假设变量
x
中有列名,可以这样做然后可以在
subset
函数中使用colname
1tu0hz3e4#
eval
绝对不是使用动态保存的变量来子集化data.table
的推荐方法。下面的示例将有所帮助:eval
对复杂字符表达式非常敏感,通常不建议用于生产代码。vnzz0bqm5#
另一个简洁的解决方案是将列重命名为固定名称,在固定名称列上执行操作,然后重命名。避免所有不可读和不可记的代码。