Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列与行不同的R data.table单元格的矢量化分配_R_Data.table_Vectorization - Fatal编程技术网

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

列与行不同的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(

我在思考如何通过引用有效地分配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或.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