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个列名的快速备忘单,用于不同的常见场景,我将不胜感激.

UPDATE:

我可以对列名进行硬编码的一些具体示例:

x.short = subset(x, abs(dist)<=100)
set(x, which(x$val<10), "val", 0) 

现在假设distcol="dist"valcol="val".使用distcolvalcol(而不是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中删除它,则不会.

另一种 Select 是使用get:

diststr = "dist"
valstr = "val"

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

R相关问答推荐

根据shiny 应用程序中的数字输入更改图标 colored颜色

使用R的序列覆盖

使用gggrassure减少地块之间的空间

筛选出以特定顺序患病的个体

移除仪表板Quarto中顶盖和车身之间的白色区域

Select 季度月值

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

将多个变量组合成宽格式

按列中显示的配对组估算NA值

R+reprex:在呈现R标记文件时创建可重现的示例

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

我是否可以使用多个变异项来构建顺序列(标记多个问题)

在不对R中的变量分组的情况下取两行的平均值

随机 Select 的非NA列的行均数

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

roxygen2正在处理太多的文件

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

以R表示的NaN值的IS.NA状态