我在思考如何通过引用有效地分配data.table的单个单元格时遇到了问题。每列(除了id)表示受试者在某一天的状态。
为了便于说明,每行的待切换列存储在单独的列表或向量中。以下for循环完成了工作,但实际数据非常大(因此也通过引用分配),更原生的解决方案将是理想的。
dt = data.table(id = letters[1:5],
`1`=0,`2`=0,`3`=0)
d = c(3,2,1,2,3)
for (i in 1:nrow(dt)) {
print(d[i])
dt[i,1+d[i] := 1]
}
print(dt)
# id 1 2 3
# 1: a 0 0 1
# 2: b 0 1 0
# 3: c 1 0 0
# 4: d 0 1 0
# 5: e 0 0 1
我尝试使用的所有东西.SD或。我都失败了,也许有人可以指出我正确的方向?
e.g。
dt[,d[.I] := 1]
答案 0 :(得分:4)
我会在for循环中使用dt <- data.table(id = letters[1:5], state = d)
# id state
# 1: a 3
# 2: b 2
# 3: c 1
# 4: d 2
# 5: e 3
dcast(dt, id ~ state, fun.aggregate = length)
# id 1 2 3
# 1: a 0 0 1
# 2: b 0 1 0
# 3: c 1 0 0
# 4: d 0 1 0
# 5: e 0 0 1
或set
来代替行:
:=
答案 1 :(得分:2)
另一种方法是从data.table
的{{1}}和状态向量开始,然后重塑
id
答案 2 :(得分:2)
base R
方法是使用row/column
索引
setDF(dt)
dt[-1][cbind(seq_len(nrow(dt)), d)] <- 1
dt
# id 1 2 3
#1 a 0 0 1
#2 b 0 1 0
#3 c 1 0 0
#4 d 0 1 0
#5 e 0 0 1