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

Kev*_*ori 3 r data.table

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

apply(DT, 1, median)  # DT is my data.table
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

apply(DT, 1, median)
# [1] 4.5 3.0 5.5
Run Code Online (Sandbox Code Playgroud)

Jaa*_*aap 5

一个选项是使用包中rowMedians:

library(matrixStats)
DT[, med := rowMedians(as.matrix(.SD))][]
Run Code Online (Sandbox Code Playgroud)

这使:

> 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
Run Code Online (Sandbox Code Playgroud)

或仅与data.table:

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