我有一个相当大的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
答案 0 :(得分:5)
一个选项是使用matrixstats包中的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][]