我尝试使用data.table执行一个简单的求和并用行表示,但是我得到了意想不到的结果。我按照FAQ manual第2节中的帮助获取了data.table。我发现了一种有效的方法,但我不确定为什么常见问题解答第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
答案 0 :(得分:3)
一些事情:
dt[, genesum:=lapply(.SD,sum), by=gene]
和dt[, genesum:=apply(dt[,-1, with=FALSE],1, sum)]
完全不同。
dt[, genesum:=lapply(.SD,sum), by=gene]
遍历.SD
data.table的列并将它们相加
dt[, genesum:=apply(dt[,-1, with=FALSE],1, sum)]
循环播放行(即。apply(x, 1, function)
将function
应用于x
我认为你可以通过调用rowSums
得到你想要的东西,如下:
dt[, genesum := rowSums(dt[, -1, with=FALSE])]
这就是你要追求的吗?
答案 1 :(得分:1)
以下是另一种选择(based on this SO question):
dt[ , genesum := sum(.SD[, -1, with=FALSE]), by = 1:NROW(dt) ]
另一种选择:
# OR... you can create a column with row positions and apply your function by row
dt[, rowpos := .I]
dt[ , genesum := sum(.SD[, -1, with=FALSE]), by = rowpos]