gpt4 book ai didi

通过变量中保存的名称引用 data.table 列

转载 作者:行者123 更新时间:2023-12-02 03:27:10 24 4
gpt4 key购买 nike

data.table是一个很棒的 R 包,我在我正在开发的库中使用它。到目前为止,除了一个并发症之外,一切进展顺利。引用 data.table 似乎要困难得多(与传统数据框相比)。使用保存在变量中的名称的列(对于数据框,例如: 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 ,但不是distval

最佳答案

如果您要在 j 表达式中执行复杂的操作,您可能应该使用 evalquote。当前版本的 data.table 中存在的一个问题是 eval 的环境并不总是被正确处理 - eval and quote in data.table (注意:该答案已根据软件包的更新进行了更新。) - 当前的修复是将 .SD 添加到 eval。据我从一些测试中可以看出,我运行的这不会影响速度(例如在 j 中使用 .SD[1] 会)。

有趣的是,这个问题只困扰 j,您通常在 i 中使用 eval 就可以了(其中 .SD 无论如何都不可用)。

另一个问题是赋值,你必须有字符串。我知道一种从带引号的表达式中提取字符串名称的方法 - 它不太漂亮,但它有效。这是一个将所有内容组合在一起的示例:

x = data.table(dist = c(1:10), val = c(1:10))
distcol = quote(dist)
valcol = quote(val)

x[eval(valcol) < 5,
capture.output(str(distcol, give.head = F)) := eval(distcol)*sum(eval(distcol, .SD))]

请注意,我可以不在一个 eval(distcol) 中添加 .SD,但如果我将其从另一个 eval 中取出,就不行了.

另一种选择是使用get:

diststr = "dist"
valstr = "val"

x[get(valstr) < 5, c(diststr) := get(diststr)*sum(get(diststr))]

关于通过变量中保存的名称引用 data.table 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16617226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com