列与行不同的R data.table单元格的矢量化分配
我在思考如何通过引用有效地分配data.table的各个单元格时遇到了一个问题。每一列(id除外)都表示受试者在特定日期的状态 为了便于说明,每行要切换的列存储在单独的列表或向量中。下面的for循环完成了这项工作,但实际数据非常大(因此也通过引用进行分配),因此更原生的解决方案是理想的列与行不同的R data.table单元格的矢量化分配,r,data.table,vectorization,R,Data.table,Vectorization,我在思考如何通过引用有效地分配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 = 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或.I都失败了,也许有人能给我指出正确的方向
e、 g
另一种方法是从
id
s的data.table
和状态向量开始,然后重塑
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
dt我会在for循环中为列而不是行使用set
或:=
:
for(i in seq_along(dt)[-1]){
set(dt, NULL, i, 0 + (d == i - 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
baser
方法是使用行/列
索引
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
setDF(dt)
dt[-1][cbind(seq_len(nrow(dt)),d)]注意到set
也是数据中的参照更新操作符。表
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