修改 table 中多列的值

modify values of multiple columns in a table

所以,这是我的示例数据:

library(data.table)
mydata <- fread(
"sample,neg1,neg2,neg3,gen1,gen2
sample1,   0,   1,   2,  30, 60
sample2,   1,   0,   1,  15, 30
sample3,   2,   1,   0,  10, 20
")

并且在每一行中我想减去背景(mean 列 "neg" 列)。我当前的代码如下:

negatives <- names(mydata)[grep("^neg", names(mydata))] # "neg1" "neg2" "neg3"
mydata[, names(mydata)[-1]:={
  bg <- mean(unlist(.SD[, negatives, with=F]));
  .SD - as.integer(bg);
}, with=F, by=sample]

# mydata
#    sample neg1 neg2 neg3 gen1 gen2
#1: sample1   -1    0    1   29   59
#2: sample2    1    0    1   15   30
#3: sample3    1    0   -1    9   19

它完成了工作,但在我真正更大的 table 上运行起来相当慢 - 我想,这是因为使用了 .SD。有没有更好的方法来完成这项任务?以某种方式使用 set

(这个问题和我的非常相似:源数据在这里是另一种形式,所以我找不到与set应用相同解决方案的方法,希望它会不被视为重复)。

您可以获得 "neg" 的 rowMeans 列 ("val"),然后更新数据集的所有列(从 "val" 中减去),除了第一次使用 set.

 indx <- grep('^neg', names(mydata))
 val <- as.integer(rowMeans(mydata[, ..indx]))
 for(j in 2:ncol(mydata)){
  set(mydata, i=NULL, j=j, value=mydata[[j]]-val)
 }

 mydata
 #    sample neg1 neg2 neg3 gen1 gen2
 #1: sample1   -1    0    1   29   59
 #2: sample2    1    0    1   15   30
 #3: sample3    1    0   -1    9   19