我有一个相当大的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)
一个选项是使用matrixstats包中rowMedians的-function:
library(matrixStats)
DT[, med := rowMedians(as.matrix(.SD))][]
Run Code Online (Sandbox Code Playgroud)
这使:
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
或仅与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)
| 归档时间: |
|
| 查看次数: |
976 次 |
| 最近记录: |