修改表中多列的值

时间:2015-02-20 04:25:27

标签: r data.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
")

并且在每一行中我想要减去背景(&{34; neg&#34;列的mean)。我目前的代码如下:

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

它完成了这项工作,但在我真正更大的桌子上工作得很慢 - 我认为,这是因为使用了.SD。有没有更好的方法来完成这项任务?以某种方式使用set

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

1 个答案:

答案 0 :(得分:1)

您可以获取“neg”的rowMeans列(“val”),然后使用set更新数据集的所有列(从“val”减去)。

 indx <- grep('^neg', names(mydata))
 val <- as.integer(rowMeans(mydata[,indx,with=FALSE]))
 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