我正在尝试使用data.table按行进行简单的求和和平均值,但我得到了意外的结果。我遵循了FAQ手册第2节中关于data.table的帮助。我找到了一种有效的方法,但我不确定为什么FAQ第2节中的这种方法不起作用。该方法给出了错误的结果(即它给出了第一列的值)。
dt[, genesum:=lapply(.SD,sum), by=gene]
head(dt)
gene TCGA_04_1348 TCGA_04_1362 genesum
1: A1BG 0.94565 0.70585 0.94565
2: A1BG-AS 0.97610 1.15850 0.97610
3: A1CF 0.00000 0.02105 0.00000
4: A2BP1 0.00300 0.04150 0.00300
5: A2LD1 4.57975 5.02820 4.57975
6: A2M 60.37320 36.09715 60.37320
这样做可以得到我所期望的结果
dt[, genesum:=apply(dt[,-1, with=FALSE],1, sum)]
head(dt)
gene TCGA_04_1348 TCGA_04_1362 genesum
1: A1BG 0.94565 0.70585 1.65150
2: A1BG-AS 0.97610 1.15850 2.13460
3: A1CF 0.00000 0.02105 0.02105
4: A2BP1 0.00300 0.04150 0.04450
5: A2LD1 4.57975 5.02820 9.60795
6: A2M 60.37320 36.09715 96.47035
我有很多列和行,这只是其中的一部分。这与我设置密钥的方式有关吗?
tables()
NAME NROW MB COLS KEY
[1,] dt 20,785 2 gene,TCGA_04_1348_01A,TCGA_04_1362_01A,genesum gene
rowSums
应该更快,因为我相信它避免了在R中的循环,但是如果输入不是矩阵,它也会创建一个副本来将其转换为矩阵。 - Steve Lianoglou