如果变量名存储在字符向量中,如何引用data.table中的变量?例如,这适用于data.frame:

df <- data.frame(col1 = 1:3)
colname <- "col1"
df[colname] <- 4:6
df
#   col1
# 1    4
# 2    5
# 3    6

如何对数据执行相同的操作.表,带或不带:=符号?dt[ , list(colname)]这个显而易见的东西不起作用(我也没想到它会起作用).

推荐答案

以编程方式创建select个变量的两种方法:

  1. with = FALSE:

  2. "dot dot"(..)前缀:

     DT[, ..colname]    
     #    col1
     # 1:    1
     # 2:    2
     # 3:    3
    

有关"dot-dot"(..)符号的进一步说明,请参见New Features in 1.10.2(帮助文本中目前未对其进行描述).

对于assign到变量,将:=的LHS括在括号中:

DT[, (colname) := 4:6]    
#    col1
# 1:    4
# 2:    5
# 3:    6

后者被称为列plonk,因为通过引用替换整个列向量.如果存在子集i,它将通过引用进行子分配.(colname)左右的parens是v1版中引入的一种速记.2014年10月9.4日.这里是the news item:

考虑到这种包装方式,现在在所有情况下都不推荐使用with = FALSE:=

colVar = "col1"
DT[, (colVar) := 1]                             # please change to this
DT[, c("col1", "col2") := 1]                    # no change
DT[, 2:4 := 1]                                  # no change
DT[, c("col1","col2") := list(sum(a), mean(b))]  # no change
DT[, `:=`(...), by = ...]                       # no change

另见第?`:=`章第Details节:

DT[i, (colnamevector) := value]
# [...] The parens are enough to stop the LHS being a symbol

为了回答 comments 中的进一步问题,这里有一种方法(通常有很多种方法):

DT[, colname := cumsum(get(colname)), with = FALSE]
#    col1
# 1:    4
# 2:    9
# 3:   15 

或者,您可能会发现读、写和调试eval a paste更容易,类似于构造一个动态SQL语句发送到服务器:

expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
# [1] "DT[,col1:=cumsum(col1)]"

eval(parse(text=expr))
#    col1
# 1:    4
# 2:   13
# 3:   28

如果你经常这样做,你可以定义一个助手函数EVAL:

EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))

EVAL("DT[,",colname,":=cumsum(",colname,")]")
#    col1
# 1:    4
# 2:   17
# 3:   45

既然data.table 1.8.2自动优化了j的效率,那么最好使用eval方法.例如,j中的get()阻止了一些优化.

或者,有set()个.:=是一种低开销、功能性的形式,在这里就可以了.见?set.

set(DT, j = colname, value = cumsum(DT[[colname]]))
DT
#    col1
# 1:    4
# 2:   21
# 3:   66

R相关问答推荐

在集合群体模型中计算时间步依赖的速率/参数

创建重复删除的唯一数据集组合列表

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

寻找图片边缘

在(g)子中使用asserable字符

保存包含循环和ifelse的函数的输出

在垂直轴中包含多个ggplot2图中的平均值

计算具有奇数日期的运行金额

如何在区分不同条件的同时可视化跨时间的连续变量?

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

如何自定义3D散点图的图例顺序?

汇总数据表中两个特定列条目的值

在R gggplot2中是否有一种方法将绘图轴转换成连续的 colored颜色 尺度?

通过在colname中查找其相应值来创建列

从圆到R中的多边形的标绘雷达图

QY数据的处理:如何定义QY因素的水平

如何在ggplot2中创建多个y轴(每个变量一个)

构建一个6/49彩票模拟系统

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

排序R矩阵的行和列