统计列表元素首列值并生成含计数的新数据框
统计列表元素首列值的出现次数并生成计数DataFrame
给定一个包含矩阵(含空元素)的列表,需要统计每个列表元素首列中指定分类(a、b、c)的出现次数,最终生成每行对应列表元素、每列对应分类的计数DataFrame。
输入示例
my_list <- list(cbind(c("a", "b", "a"),c("R", "B", "R")), cbind(), cbind(c("a", "a", "c","b"),c("B", "R", "R","B")))
期望输出
a b c 1 2 1 0 2 0 0 0 3 2 1 1
解决方案(基础R实现)
无需额外依赖包,用基础R函数即可完成:
# 定义需要统计的目标分类 categories <- c("a", "b", "c") # 遍历列表处理每个元素 count_list <- lapply(my_list, function(elem) { # 处理空元素 if (length(elem) == 0) { setNames(rep(0, length(categories)), categories) } else { # 提取首列并统计次数 col1_counts <- table(elem[, 1]) # 匹配所有分类,缺失分类补0 sapply(categories, function(cat) { ifelse(cat %in% names(col1_counts), col1_counts[cat], 0) }) } }) # 转换为DataFrame result_df <- as.data.frame(do.call(rbind, count_list)) colnames(result_df) <- categories # 查看结果 print(result_df)
解决方案(tidyverse实现)
如果习惯使用tidyverse工具链,代码更简洁直观:
library(tidyverse) categories <- c("a", "b", "c") result_df <- map_dfr(my_list, function(elem) { if (length(elem) == 0) { # 空元素生成全0的行 tibble(!!!set_names(rep(0, length(categories)), categories)) } else { # 提取首列、统计次数、补全缺失分类、转宽格式 elem[, 1] %>% as_tibble_col("val") %>% count(val) %>% complete(val = categories, fill = list(n = 0)) %>% pivot_wider(names_from = val, values_from = n) } }) print(result_df)
内容的提问来源于stack exchange,提问作者megmac
相关产品推荐
相关产品推荐

