我有一个包含许多编号列的 data.table。作为一个更简单的例子,我有这个:
dat <- data.table(cbind(col1=sample(1:5,10,replace=T),
col2=sample(1:5,10,replace=T),
col3=sample(1:5,10,replace=T),
col4=sample(1:5,10,replace=T)),
oneMoreCol='a')
我想创建一个新列,如下所示:在每一行中,如果值不是 NA 或 1,我们将添加 col1-col4 列中的值。
我当前的代码有两个 for 循环,这显然不是这样做的方法:
for(i in 1:nrow(dat)){
dat[i,'sumCol':={temp=0;
for(j in 1:4){if(!is.na(dat[i,paste0('col',j),with=F])&
dat[i,paste0('col',j),with=F]!=1
){temp=temp+dat[i,paste0('col',j),with=F]}};
temp}]}
如果有关于如何删除这个 for 循环的建议,我将不胜感激。我的代码在更大的 data.table 上运行,需要很长时间才能运行。
最佳答案
可能的解决方案:
dat[, sumCol := rowSums(.SD * (.SD != 1), na.rm = TRUE), .SDcols = col1:col4]
给出:
> dat col1 col2 col3 col4 oneMoreCol sumCol 1: 4 5 5 3 a 17 2: 4 5 NA 5 a 14 3: 2 3 4 3 a 12 4: 1 2 3 4 a 9 5: 4 3 NA 5 a 12 6: 2 2 1 4 a 8 7: NA 2 NA 5 a 7 8: 4 2 2 4 a 12 9: 4 1 5 4 a 13 10: 2 1 5 1 a 7
使用的数据:
set.seed(20200618)
dat <- data.table(cbind(col1=sample(c(NA, 1:5),10,replace=T),
col2=sample(1:5,10,replace=T),
col3=sample(c(1:5,NA),10,replace=T),
col4=sample(1:5,10,replace=T)),
oneMoreCol='a')
关于r - 当我们想通过引用有条件地添加列时,如何避免 for 循环? (每行单独评估的条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62452394/