【问题标题】:R data.table - most frequent combinations of column values including subtotalsR data.table - 最常见的列值组合,包括小计
【发布时间】:2021-09-22 13:17:43
【问题描述】:

我有一个包含多个(最多 30 个)整数列的 R data.table,并希望找到它们的值的最频繁组合,包括小计。

此代码有效:

library(data.table)
set.seed(1107)

dt<-data.table(col1=sample(1:10,1000,TRUE),col2=sample(1:20,1000,TRUE),col3=sample(1:5,1000,TRUE),col4=sample(1:15,1000,TRUE),col5=sample(1:33,1000,TRUE))
group_vars<-c('col1','col2','col3','col4','col5')
dt_cube<-cube(dt,.(N=.N),by=group_vars)
dt_cube[order(-1*N)][1:5,]

并提供如下输出:

   col1 col2 col3 col4 col5    N
1:   NA   NA   NA   NA   NA 1000
2:   NA   NA    3   NA   NA  210
3:   NA   NA    1   NA   NA  209
4:   NA   NA    5   NA   NA  198
5:   NA   NA    2   NA   NA  197

问题是真实数据非常大,无法计算整个立方体。我对前 100 个最常见的组合(包括小计)感兴趣。有什么方法可以在不产生整个立方体的情况下获得它?

【问题讨论】:

  • 您多次提到 "包括小计",但您的代码没有计算总和,而且(对我而言)您的意思并不明显。请您再解释一下好吗?
  • 对不起,我的意思是立方体产生的小计 - 例如输出中的第一行是总计(col1 的所有值和 col2 的所有值 ...),第二行是小计,col3 中有 3,其余列中的任何值等等。
  • 你能在 cube() 之前生成一个包含前 100 个结果的表吗?比如 dt_top100

标签: r data.table


【解决方案1】:

所以有内存效率和时间效率。如果我们没有内存限制,那么我们通常想要花费最少时间的方法。在您的情况下,您的内存受限(我猜这就是为什么您不能在完整数据集上运行多维数据集)并且不得不放弃速度效率,毕竟当您只需要 5 行时,多维数据集返回 16000 多行.

试试这个:

top_combos<-5 #change this to whatever number you want, ie 100

endsummary<-data.table(N=rep(0,top_combos))
for(col in group_vars) endsummary[,(col):=as.integer(NA)]

for(i in 0:length(group_vars)) {
  j<-combn(group_vars, i)
  for(k in 1:ncol(j)) {
    sub_dt<-dt[,.N,by=eval(j[,k])][order(-N)]
    for(l in setdiff(group_vars, j[,k])) sub_dt[,(l):=as.integer(NA)]
    endsummary<-rbindlist(list(endsummary, sub_dt),use.names=TRUE)[order(-N)][1:top_combos]
  }
}
endsummary

它基本上做了立方体所做的事情,但不保留任何东西,除非它的计数高于它之前的计数。

【讨论】:

  • 谢谢。有用。但在大数据上它实际上比立方体慢。
  • 嗯,是的,我没想到它会更快。您所说的问题是您的数据太大,多维数据集无法工作
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多