考虑下一个:
dt1 <- data.table(id = c(1,1,1,2,2,2,2), status = c(0,1,1,2,3,0,2), val = c(2,2,4,1,2,3,1))
我使用group by(id,status)和mean func来创建名称包含0到3状态值的列:
stat <- c(0:3)
for(i in 1:length(stat)) dt1[, eval(paste("meanval.stat.", stat[i], sep = "")) := mean(val, na.rm = TRUE), by = .(id, status == stat[i])]
下一步结果:
id status val meanval.stat.0 meanval.stat.1 meanval.stat.2 meanval.stat.3
1: 1 0 2 2.000000 2.00 2.666667 2.666667
2: 1 1 2 3.000000 3.00 2.666667 2.666667
3: 1 1 4 3.000000 3.00 2.666667 2.666667
4: 2 2 1 1.333333 1.75 1.000000 1.666667
5: 2 3 2 1.333333 1.75 2.500000 2.000000
6: 2 0 3 3.000000 1.75 2.500000 1.666667
7: 2 2 1 1.333333 1.75 1.000000 1.666667
但我期待下一个结果:
id status val meanval.stat.0 meanval.stat.1 meanval.stat.2 meanval.stat.3
1: 1 0 2 2 3 0 0
2: 1 1 2 2 3 0 0
3: 1 1 4 2 3 0 0
4: 2 2 1 3 0 1 2
5: 2 3 2 3 0 1 2
6: 2 0 3 3 0 1 2
7: 2 2 1 3 0 1 2
我不明白我的解决方案逻辑是什么错误
答案 0 :(得分:1)
也许逻辑是按'id'分组,基于通过将'status'与'stat'的每个元素进行比较而创建的逻辑vector
来'val'的子集,得到{{1将它分配给新列('nm1'),如果有mean
,NaN
将其分配给0
set