矢量分配R data.table单元格,列的行不同

时间:2017-09-03 00:59:27

标签: 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)) {
  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]

3 个答案:

答案 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