我有一个包含数百万个列表的列表,这些子列表具有一些不同的可能值,大约在10到100之间。
我想计算这些值的出现次数。
下面的代码有效,但速度非常慢。我们能更快地完成吗?
count_by_list <- function(lst, var_nm = as.character(substitute(lst)), count_nm = "n"){
unique_lst <- unique(lst)
res <- tibble::tibble(!!var_nm := unique_lst, !!count_nm := NA)
for(i in seq_along(unique_lst)){
res[[count_nm]][[i]] <- sum(lst %in% res[[var_nm]][i])
}
res
}
x <- list(
list(a=1, b=2),
list(a=1, b=2),
list(b=3),
list(b=3, c=4))
count_by_list(x)
#> # A tibble: 3 x 2
#> x n
#> <list> <int>
#> 1 <named list [2]> 2
#> 2 <named list [1]> 1
#> 3 <named list [2]> 1
此文档由reprex package (v0.3.0)于2019-11-29创建
我尝试使用库digest
进行哈希,但实际上速度更慢了,并且随着n的增加而变得越来越糟糕:
library(digest)
count_by_list2 <- function(lst, var_nm = as.character(substitute(lst)), count_nm = "n"){
unique_lst <- unique(lst)
digested <- vapply(lst, digest, character(1))
res <- as.data.frame(table(digested))
names(res) <- c(var_nm, count_nm)
res[[1]] <- unique_lst
res
}
如果你需要进行基准测试,可以使用
x_big <- unlist(replicate(10000 ,x, F), recursive = FALSE)
。我添加了rcpp
和parallel processing
标签,因为它们可能有所帮助,但答案并不受其限制。
data.table
已经能够通过其算法给您非常快速的排序和计数(请记住:基本R使用其算法),以及可能的 openmp 并行性。 - Dirk Eddelbuettel