所以,这是我的样本数据:
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
应用相同解决方案的方法,希望它不会被认为是重复的。)
答案 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