根据data.table方式的"by"参数创建列名

Dav*_*vid 2 r data.table

说我有以下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)

akr*_*run 5

根据示例显示,我们可以使用dcastdata.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)