R语言如何统计嵌套列表数据框name字段的出现频次
R语言嵌套列表name字段频次统计实现方案
你的temp是多层嵌套的列表对象,每个顶层元素为单行数据框,目标统计的name字段存储在子级resource数据框中,存在个别resource为NA的无效条目,统计前需要先提取所有有效name值再做计数,以下是3种可直接运行的实现方案:
方案1:基础R实现(无需安装第三方包,入门首选)
不需要额外装任何包,直接用R自带函数即可完成,代码逻辑最直观:
# 遍历所有顶层条目,提取全部有效name值 all_names <- unlist(lapply(temp, function(item) { # 跳过resource为NA的无效条目 if (all(is.na(item$resource))) return(NULL) # 返回当前条目下的所有name值 item$resource$name })) # 生成频次统计表,重命名为易读的列名 name_count <- as.data.frame(table(all_names), stringsAsFactors = FALSE) colnames(name_count) <- c("name", "count")
运行你提供的示例数据,输出结果中MicroPro #1对应的count值为3,和预期结果一致。
方案2:tidyverse实现(代码可读性强,适合后续数据加工)
如果平时习惯用tidyverse生态做数据处理,可以用这个方案,输出为tibble格式,衔接筛选、可视化等操作更顺畅:
# 首次使用先运行安装命令:install.packages("tidyverse") library(tidyverse) name_count <- map_dfr(temp, ~{ # 跳过无效的NA条目 if (all(is.na(.x$resource))) return(tibble()) # 提取name列合并为总表 .x$resource %>% select(name) }) %>% # 按name分组计数 count(name, name = "count")
方案3:data.table实现(大数据量场景性能最优)
如果你的全量数据规模达到十万、百万级,用data.table方案运行速度远高于前两种:
# 首次使用先运行安装命令:install.packages("data.table") library(data.table) # 批量合并所有有效name列 all_names <- rbindlist(lapply(temp, function(item) { if (all(is.na(item$resource))) return(data.table()) data.table(name = item$resource$name) })) # 分组统计频次 name_count <- all_names[, .(count = .N), by = name]
*小提示:如果需要按出现次数从高到低排序,只需要在生成统计表后追加对应排序代码即可:
- 基础R版本追加:
name_count <- name_count[order(-name_count$count), ] - tidyverse版本在count后追加:
%>% arrange(desc(count)) - data.table版本在最后追加:
[order(-count)]*
内容的提问来源于stack exchange,提问作者Eric Dodson
相关产品推荐
相关产品推荐

