R Data.table 用于计算跨多列的汇总统计信息

Posted

技术标签:

【中文标题】R Data.table 用于计算跨多列的汇总统计信息【英文标题】:R Data.table for computing summary stats across multiple columns 【发布时间】:2014-05-07 14:57:53 【问题描述】:

我有一个类似的问题:R: data.table : searching on multiple columns AND setting data type,但这个问题没有得到完全回答。我有一个成对的表格,在概念上看起来像下面的表格。该表是将一个非常大的距离矩阵转换为 data.table(> 100,000,000 行)的结果,这样比较 a,b 与 b,a 相同。但是,a 和 b 可能出现在 V1 或 V2 列中。我想使用 data.table 的查询样式计算简单的汇总统计信息,但我还没有完全弄清楚如何在任一列中选择键。这可能吗?

我尝试在任一方向设置键,但这只会返回该列的数据。我也尝试使用 list(),但它返回交集(可以理解),我希望得到一个 by=key1|key2,但没有这样的运气。


> set.seed(123)
> 
> #create pairwise data
> a<-data.table(t(combn(3,2)))
> #create column that is equal both ways, 1*2 == 2*1
> dat<-a[,data:=V1*V2]
> dat
   V1 V2 data
1:  1  2    2
2:  1  3    3
3:  2  3    6
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2)

> #set keys
> setkey(dat,V1,V2)
> 
> #One way data
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1]
> dat
   V1 V2 data MEAN VAR
1:  1  2    2  2.5 0.5
2:  1  3    3  2.5 0.5
3:  2  3    6  6.0  NA

> #The other way
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2]
> dat
   V1 V2 data MEAN VAR
1:  1  2    2  2.0  NA
2:  1  3    3  4.5 4.5
3:  2  3    6  4.5 4.5
> 
> #The intersect just produces the original data
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)]
> dat
   V1 V2 data MEAN VAR
1:  1  2    2    2  NA
2:  1  3    3    3  NA
3:  2  3    6    6  NA
> 
> #Meaningless but hopefull attempt. 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2]
> dat
   V1 V2 data     MEAN      VAR
1:  1  2    2 3.666667 4.333333
2:  1  3    3 3.666667 4.333333
3:  2  3    6 3.666667 4.333333
#The goal is to create a table would look like this (using mean as an example)
ID MEAN
 1  2.5
 2  4.0
 3  4.5

我的默认想法过于循环通过 dat[V1==x|V2==x] 语句,但我不认为我正在利用 data.table 的全部功能来返回一个 single 列的 id 表示 var 作为汇总列。

谢谢!

【问题讨论】:

您在这里的预期结果到底是什么? 已编辑以反映希望的结果,即单列 ids,其中包含该 ID 的均值和 var。感谢您帮助澄清。 【参考方案1】:

稍微重新排列你的数据以达到你想要的效果是最简单的(我在下面使用data的回收而不是在第一部分输入c(data, data)):

dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1]
#   V1 MEAN
#1:  1  2.5
#2:  2  4.0
#3:  3  4.5

【讨论】:

以上是关于R Data.table 用于计算跨多列的汇总统计信息的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多列和多行“汇总”数据

R语言进行数据聚合统计(Aggregating transforms)计算滑动窗口统计值(Window Statistics):使用R原生方法data.tabledplyr等方案计算滑动分组统计

如何在 data.table 中添加一列并返回多列而不修改基础数据?

R语言进行数据聚合统计(Aggregating transforms)实战:使用R原生方法data.tabledplyr等方案计算分组均值并添加到可视化结果中

R - data.table 行中的反透视列表

R语言学习笔记之——数据处理神器data.table