如果变量名存储在字符向量中,如何引用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)]
这个显而易见的东西不起作用(我也没想到它会起作用).
如果变量名存储在字符向量中,如何引用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个变量的两种方法:
with = FALSE
:
"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