由于您处理的是data.frame,因此您可以遍历列并使用tabulate() 而不是table()。 tabulate() 通常要快得多。既然你提到你遇到了内存问题,你可以只使用一个简单的for 循环。
这是一个包含 590 万行的 100 列 data.frame 的示例。
set.seed(1)
mydf <- data.frame(replicate(100, sample(100, 59e5, TRUE, prob = (1 / 1:100)/sum(1/1:100))))
创建一个具有预期唯一值数量的空向量。在这里,我将其硬编码为 100,但您可以通过不同的方式有效地找到它。
x <- vector(mode = "integer", length = 100)
使用for 循环和tabulate,在每次迭代时将值添加到您的向量中。
for (i in seq_along(mydf)) {
a <- tabulate(mydf[[i]], nbins = 100)
x <- x + a
}
结果如下:
x
# [1] 113728224 56869605 37921007 28438216 22749305 18957822 16246750 14217145 12635554 11371434
# [11] 10336993 9476935 8754409 8127218 7580889 7108428 6688372 6318092 5988240 5685836
# [21] 5420640 5167806 4949677 4742169 4552045 4375381 4213460 4062181 3918424 3791238
# [31] 3667651 3554914 3444016 3343632 3248479 3157525 3073123 2993397 2914555 2843628
# [41] 2773669 2709270 2647620 2582847 2524157 2476936 2418578 2367692 2322076 2274352
# [51] 2229395 2187669 2148847 2107710 2068427 2030564 1996654 1962316 1927702 1894340
# [61] 1863165 1834852 1807164 1776901 1747323 1722719 1694721 1672816 1646864 1623807
# [71] 1602506 1579049 1556790 1535832 1517130 1495177 1476688 1457067 1437976 1421363
# [81] 1404197 1386446 1372361 1354048 1338653 1321241 1308175 1292688 1278896 1264299
# [91] 1249357 1237313 1222000 1210713 1198957 1186282 1172569 1161049 1148689 1136921
如果你想要一个命名向量作为结果,你可以使用setNames(x, 1:100)。
测试它的性能。这一次,我没有硬编码预期的向量长度:
myfun <- function(mydf) {
maxint <- max(vapply(mydf, max, 1L))
x <- vector(mode = "integer", length = maxint)
for (i in seq_along(mydf)) {
a <- tabulate(mydf[[i]], nbins = maxint)
x <- x + a
}
x
}
system.time(myfun(mydf))
# user system elapsed
# 1.200 0.000 1.201
与 CPak 的方法比较,后者使用 table。
# merge results
merge_tables <- function(L) {
require(dplyr)
DF <- do.call(rbind, lapply(L, data.frame))
ans <- DF %>%
group_by(Var1) %>%
summarise(Freq = sum(Freq))
return(ans)
}
cPakFun <- function(mydf) {
Ts <- lapply(mydf, table) # table of each split
merge_tables(Ts)
}
system.time(cPakFun(mydf))
# user system elapsed
# 150.937 1.041 152.872