如何使用data.table有效地计算行中位数

时间:2018-02-20 12:33:32

标签: r data.table

我有一个相当大的data.table(15M行,15列),我想要计算每行的中位数。我可以使用

来做到这一点
apply(DT, 1, median)  # DT is my data.table

但这很慢。是否有更快,更适合数据的替代方案?

作为一个小例子,如果我有

DT = data.table(a = c(1, 2, 4), b = c(6, 4, 7), 
                c = c(3, 9, 9), d = c(18, 1, -5))
#    a b c  d
# 1: 1 6 3 18
# 2: 2 4 9  1
# 3: 4 7 9 -5

计算行中位数的最有效方法是什么?

apply(DT, 1, median)
# [1] 4.5 3.0 5.5

1 个答案:

答案 0 :(得分:5)

一个选项是使用包中的rowMedians - 函数:

library(matrixStats)
DT[, med := rowMedians(as.matrix(.SD))][]

给出:

> DT
   a b c  d med
1: 1 6 3 18 4.5
2: 2 4 9  1 3.0
3: 4 7 9 -5 5.5

或仅使用data.table

DT[, med := melt(DT, measure.vars = names(DT))[, r := 1:.N, variable][, median(value), by = r]$V1][]