我有一个相当大的data.table(1500万行,15列),我想为其计算每行的中位数。我可以使用
apply(DT, 1, median) # DT is my data.table
但这很慢。是否有更快的,对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
一个选项是使用matrixstats包中rowMedians
的-function:
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][]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句