在二楼的基础上, 我追加了data.table方法, 最终拿到的数据是20万个元素的list花费17.24秒完成所有计算, 应该能够满足你的需求. 程序运行效率与数据规模见下:
user system elapsed
16.33 0.67 17.24
> length(dm)
[1] 200000
> sum(sapply(dm, length))
[1] 5090840
具体代码见下:library(data.table)
system.time({
# 生成dm数据
length <- sample(1:50, 200000, replace=T)
dm <- vector("list", 200000)
for (i in 1:200000){
dm[[i]] <- sample(1:100, length[i], replace=T)
}
# 将dm从list转换为data.table
library(data.table)
where <- rep(1:length(dm), times=length)
what <- unlist(dm)
dm_dt <- data.table(where=where, what=what)
# rm(length, where, what); gc()
# 将data.table从长表转化为宽表
dm_dt <- dcast.data.table(dm_dt, where~what)
# 循环运算
while(nrow(dm_dt)!=0){
# 那列最多? 该列的列名是什么?
dc <- colnames(dm_dt)[which.max(dm_dt[, lapply(.SD, sum), .SDcols=2:ncol(dm_dt)])+1]
# 按dc列删除数据行(原来list中的每个元素)
dm_dt <- dm_dt[get(dc)==0,]
# 按dc列删除数据列(没有用处的频次统计列)
dm_dt <- dm_dt[, dc:=NULL, with=F]
}
})