Операции со строками в data.table
Я пытаюсь выполнить простую сумму и среднее по строкам, используя data.table, но я получаю неожиданные результаты. Я последовал за помощью в разделе 2 руководства FAQ для 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
2 ответа
Несколько вещей:
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])]
Это то, что вы после?
Вот одна альтернатива ( основанная на этом вопросе SO):
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]