说我有以下data.table
dt <- data.table(var = c("a", "b"), val = c(1, 2))
Run Code Online (Sandbox Code Playgroud)
现在我想添加两个新列dt,命名a,并b使用相应的值(1,2).我可以通过循环执行此操作,但我想以data.table方式执行此操作.
结果将是data.table这样的:
dt.res <- data.table(var = c("a", "b"), val = c(1, 2), #old vars
a = c(1, NA), b = c(NA, 2)) # newly created vars
Run Code Online (Sandbox Code Playgroud)
到目前为止,我想出了类似的东西
dt[, c(xx) := val, by = var]
Run Code Online (Sandbox Code Playgroud)
where xx将是一个data.table类似于-group的.N地址,其中包含by-group 的值.
谢谢您的帮助!
附录:for循环方式
使用for-loop而不是-argument的非data.table-way by看起来像这样:
for (varname in dt$var){
dt[var == varname, c(varname) := val]
}
Run Code Online (Sandbox Code Playgroud)
根据示例显示,我们可以使用dcast从data.table将长格式转换为宽格式,并与原始数据集on"val"列连接.
library(data.table)#v1.9.6+
dt[dcast(dt, val~var, value.var='val'), on='val']
# var val a b
#1: a 1 1 NA
#2: b 2 NA 2
Run Code Online (Sandbox Code Playgroud)
或者@CathG在评论中提到,对于以前的版本,merge或者设置键列然后加入.
merge(dt, dcast.data.table(dt, val~var, value.var='val'))
Run Code Online (Sandbox Code Playgroud)