R 按列高效汇总(计数)

R 按列高效汇总(计数),r,dataframe,data.table,summarize,R,Dataframe,Data.table,Summarize,我有一个类似于datadf的大表,有30万列和行,我在stack overflow()中看到了一些获得预期摘要的方法,但对于我的表来说,即使是最快的也非常慢。编辑:对于评论,目前有几种方法是令人满意的 创建示例数据 这大约是您提供的data.table方法速度的两倍,并且应该能够很好地随数据集的大小进行扩展: setDT(datadf) dcast.data.table( melt.data.table(datadf, measure.vars = colnames(datadf))[, .

我有一个类似于
datadf
的大表,有30万列和行,我在stack overflow()中看到了一些获得预期摘要的方法,但对于我的表来说,即使是最快的也非常慢。编辑:对于评论,目前有几种方法是令人满意的

创建示例数据
这大约是您提供的data.table方法速度的两倍,并且应该能够很好地随数据集的大小进行扩展:

setDT(datadf)
dcast.data.table(
  melt.data.table(datadf, measure.vars = colnames(datadf))[, .N, .(variable, value)], 
  value ~ variable,
  value.var = "N",
  fill = 0
)

我很想看看完整数据集的基准测试,因为不是所有这些方法都可以类似地扩展。

也许这会使
tidyverse
方法更快
datadf%%>%gather()%%>%count(key,value)%%>%spread(key,n,fill=0L)
对此一无所知。没有选中:)只是想提供一个替代的
tidyverse
解决方案。3000列和3000行非常小。这已经不到一秒钟了?如果您多次这样做(我想您不应该这样做),只需将数据保存在长/长格式中,并使用
table
<代码>mDT=melt(dataDT[,r:=.I],id=“r”);表(mDT[,c(“value”,“variable”))
levels=unique(unlist(datadf))
sapply
中被多次调用。一次计算并存储会更有效。可能的副本或OP可以在cpp中执行,并避免所有这些:)
library(tidyverse)
library(microbenchmark)
lev<-unique(unlist(datadf))

microbenchmark(
  #base EDITED based on comment @ fishtank
  sapply(datadf, function(x) table(factor(x, levels=lev, ordered=TRUE))), #modified based on comment

  #tidyverse EDITED based on comment @AntoniosK
  datadf %>% gather() %>% count(key, value) %>% spread(key, n, fill = 0L), # based on comment

  #data.table
  dcast(melt(dataDT, id=1:1000, measure=1:1000)[,1001:1002][, `:=` (Count = .N), by=.(variable,value)], value ~ variable ,
        value.var = "value", fun.aggregate = length),

  # Answer from @bk18
  # myDcast<-
  dcast.data.table(
    melt.data.table(dataDT, measure.vars = colnames(dataDT))[, .N, .(variable, value)],
    value ~ variable,
    value.var = "N",
    fill = 0
  ),
  times=1
)
myDcast[,1:20]

#    value var2 var2.1 var3 var3.1 var1 var3.2 var2.2 var3.3 var2.3 var1.1 var3.4 var2.4 var1.2 var3.5 var2.5 var2.6 var1.3 var3.6 var2.7
# 1:     -    0      0 1000   1000    0   1000      0   1000      0      0   1000      0      0   1000      0      0      0   1000      0
# 2:     A  254    254    0      0  280      0    254      0    254    280      0    254    280      0    254    254    280      0    254
# 3:     C  230    230    0      0  230      0    230      0    230    230      0    230    230      0    230    230    230      0    230
# 4:     G  236    236    0      0  236      0    236      0    236    236      0    236    236      0    236    236    236      0    236
# 5:     T  280    280    0      0  254      0    280      0    280    254      0    280    254      0    280    280    254      0    280



                              min          lq        mean      median          uq         max neval
   sapply-table          89.77978    89.77978    89.77978    89.77978    89.77978    89.77978     1
   gather-count-spread  849.83078   849.83078   849.83078   849.83078   849.83078   849.83078     1
   dcast-melt         19938.71910 19938.71910 19938.71910 19938.71910 19938.71910 19938.71910     1
   data.table @bk18      46.92746    46.92746    46.92746    46.92746    46.92746    46.92746     1
setDT(datadf)
dcast.data.table(
  melt.data.table(datadf, measure.vars = colnames(datadf))[, .N, .(variable, value)], 
  value ~ variable,
  value.var = "N",
  fill = 0
)