r - 当我们想通过引用有条件地添加列时,如何避免 for 循环? (每行单独评估的条件)

标签 r data.table

我有一个包含许多编号列的 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/

相关文章:

R中随机选择一个样本

r - 使用 grep 对 data.table 中的行进行子集化,比较行内容

r - 仅使用第二个键选择 data.table 中的行

r - 无法使用 par(new=T) 创建新的绘图窗口(设备?)

r - 根据是否满足 tidyverse 的一系列条件对类别进行分组

r - 如何将R中编码为 "Yes"的值更改为1?

r - 使用 ggplot2 绘制拟合的 glm 输出以进行交互

r - 在 data.tables 列表中应用列函数

r - 通过data.table roll ='nearest'函数合并两组数据

r - 仅选择出现在其他因素的每个水平中的那些水平的因素