说我有以下data.table
dt <- data.table(var = c("a", "b"), val = c(1, 2))
现在,我想向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
到目前为止,我想出了类似的东西
dt[, c(xx) := val, by = var]
其中xx
是data.table
- 与.N
类似的命令,用于解决by
- 组的值。
感谢您的帮助!
附录:for循环方式
带有for
- 循环而不是by
- 参数的非data.table-way看起来像这样:
for (varname in dt$var){
dt[var == varname, c(varname) := val]
}
答案 0 :(得分:5)
根据显示的示例,我们可以使用dcast
中的data.table
将长格式转换为宽格式,并使用原始数据集on
加入&#39; val&# 39;柱。
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
或者@CathG在评论中提到,对于以前的版本merge
或者设置键列然后加入。
merge(dt, dcast.data.table(dt, val~var, value.var='val'))