具有分组的数据表中多行和多列的中位数

Posted

技术标签:

【中文标题】具有分组的数据表中多行和多列的中位数【英文标题】:Median from multiple rows and columns in a data table with grouping 【发布时间】:2019-10-27 02:54:22 【问题描述】:

我有一个包含超过 90000 个观察值和 1201 个变量的数据表。除最后一列之外的所有列都存储数值,最后一列是源文件名称的列(超过 100 个)。这是数据表的一个小样本:

library(data.table)
DT <- data.table(V1=sample(0:100,20,replace=TRUE), 
V2=sample(0:100,20,replace=TRUE), V3=sample(0:100,20,replace=TRUE), 
V4=sample(0:100,20,replace=TRUE), V5=sample(0:100,20,replace=TRUE), 
V6=sample(0:100,20,replace=TRUE), V7=sample(0:100,20,replace=TRUE), 
file=rep(c("A","B","C","D"), each = 5))

我想要做的是计算每组中所有值的中位数(file)。所以例如对于 A 组,中位数将一次从第 1、2、3、4、5 行计算。在下一步中,我想根据组将中值分配给每一行(下面的预期输出)。

这个问题似乎很简单,我已经在 Google 上搜索了许多类似的问题,这些问题都取决于一个组(aggregate 是最流行的解决方案之一)。但是,在所有情况下,中位数计算只考虑一列。这里有 7 个(或在我的原始数据 1200 中),median 不接受 - 我应该提供一个数字向量。 因此我尝试了unlistaggregatedplyr 包、tapply 运气...

由于数据和组的数量(即file),代码应该是相当自动化和高效的......非常感谢您的帮助!

如果代码明显失败,只是一个小例子:

DT_median <- setDT(DT)[, DT_med := median(DT[,1:7]), by = file]

预期的结果应该是这样的:

V1  V2  V3  V4  V5  V6  V7  file DT_med
42  78  9   0   60  46  65  A    37.5
36  36  46  45  5   96  64  A    37.5
83  31  92  100 15  2   9   A    37.5
36  16  49  82  32  4   46  A    37.5
29  17  39  6   62  52  97  A    37.5
37  70  17  90  8   10  93  B    47
72  62  68  83  96  77  20  B    47
10  47  29  2   93  16  30  B    47
69  87  7   47  96  17  8   B    47
23  70  72  27  10  86  49  B    47
78  51  13  33  56  6   39  C    51
28  92  100 5   75  33  17  C    51
71  82  9   20  34  83  22  C    51
62  40  84  87  37  45  34  C    51
55  80  55  94  66  96  12  C    51
93  1   99  97  7   77  6   D    41
53  55  71  12  19  25  28  D    41
27  25  28  89  41  22  60  D    41
91  25  25  57  21  98  27  D    41
2   63  17  53  99  65  95  D    41

【问题讨论】:

你需要DT[, DT_med := median(unlist(.SD)), by = file] 【参考方案1】:

由于我们要从所有值中计算median,按“文件”分组,unlist Data.table 的子集 (.SD),获取 median 并分配 (:=)创建新列“DT_med”的输出

library(data.table)
DT[, DT_med := median(unlist(.SD), na.rm = TRUE), by = file]

【讨论】:

以上是关于具有分组的数据表中多行和多列的中位数的主要内容,如果未能解决你的问题,请参考以下文章

分组数据怎么求中位数

如何在 Spark 中找到分组数据的准确中位数

如何计算 Google BigQuery 中多列的中位数?

R语言vtreat包自动处理dataframe的缺失值使用分组的中位数来标准化数据列中每个数据的值(和中位数表连接并基于中位数进行数据标化)计算数据列的中位数或者均值并进行数据标准化

怎样求众数和中位数

如何对按客户分组的多列和多行求和