在表中的背景减法

时间:2015-02-19 02:49:51

标签: r data.table bioconductor

我将基因表达数据作为每个探针的计数数量,如下所示:

library(data.table)
mydata <- fread(
"molclass,mol.id,sample1,sample2,sample3
negative, negat1,  0, 1,   2
negative, negat2,  2, 1,   1
negative, negat3,  1, 2,   0
 endogen,  gene1, 30, 15, 10
 endogen,  gene2, 60, 30, 20
")

我的问题是 - 执行背景减法的最佳方法是什么,即我需要计算背景的每个sampleN列(假设它是来自negative的所有值的平均值class)然后从此列的每个值中减去此背景。目前我正在使用以下解决方案:

for (nm in names(mydata)[-c(1:2)]) {
  bg <- mydata[molclass=='negative', nm, with=F];
  bg <- mean(unlist(bg));
  mydata[[nm]] <- (mydata[[nm]] - bg);
}

但我觉得必须有一些“更好”的方式。

P.S。我知道有一些软件包可以做这些事情,但我的数据对应的是计数,而不是信号的强度 - 所以我不能使用limma或类似的微阵列工具。也许一些seq数据包可以提供帮助,但我不确定,因为我的数据也不是来自排序。

2 个答案:

答案 0 :(得分:3)

如果您需要将sample列替换为计算值,则可以使用set(如@ Frank的帖子中所示)但不创建其他对象

indx <- grep('^sample', names(mydata))
for(j in indx){
 set(mydata, i=NULL, j=j, value=mydata[[j]]- 
       mydata[molclass=='negative', mean(unlist(.SD)), .SDcols=j])
}
mydata
#   molclass  mol.id sample1    sample2 sample3
#1: negative  negat1      -1 -0.3333333       1
#2: negative  negat2       1 -0.3333333       0
#3: negative  negat3       0  0.6666667      -1
#4:  endogen   gene1      29 13.6666667       9
#5:  endogen   gene2      59 28.6666667      19

或@Frank建议的变体(效率更高)

for(j in indx){
 set(mydata, i=NULL, j=j, value=mydata[[j]]- 
    mean(mydata[[j]][mydata$molclass=='negative']))
}

答案 1 :(得分:2)

通常,您不应将<-data.table一起使用。使用set,循环中的最后一个分配会更好。有关详细信息,请参阅帮助页面,输入?set

mycols  <- paste0('sample',1:3)
newcols <- paste0(mycols,'bk')

s       <- mydata[['molclass']] == 'negative'
mybkds  <- sapply(mycols,function(j) mean(mydata[[j]][s]) )

mydata[,(newcols):=NA]
for (j in mycols) set(mydata,j=paste0(j,'bk'),value=mydata[[j]]-mybkds[j])

我只完成了循环中的最后一步,但这与你的代码基本相同(所有内容都在循环中)。 *apply函数和循环只是不同的语法,我听说过,你可以选择你喜欢的语言。