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
)