R语言计算多文件Entity.Type列各分类跨文件平均出现次数
实现方法
你现有代码已经完成了单文件分类型计数的核心逻辑,只需要把所有文件的计数结果整合后按实体类型分组求均值即可,不需要大幅改动原有代码。
方案1:基于你现有循环逻辑补全计算
首先给原有for循环补全大括号(避免后续新增代码时作用域出错),再增加结果合并、均值计算步骤即可:
library(dplyr) # 初始化存储单文件计数结果的列表 listVeh.data <- list() for (h in 1:length(listFinal.data)) { listVeh.data[[h]] <- listFinal.data[[h]] %>% filter(Entity.Type != "Lifeform") %>% # 过滤Lifeform条目,仅统计载具 group_by(Entity.Type) %>% summarize(n = n()) } # 合并所有文件的计数结果,增加file_id列标记数据来源文件 all_file_count <- bind_rows(listVeh.data, .id = "file_id") # 按实体类型分组计算平均值 avg_result <- all_file_count %>% group_by(Entity.Type) %>% summarise( total_occur = sum(n), # 可选:输出该类型在所有文件中的总出现次数 avg_occur_per_file = mean(n) # 目标结果:单文件平均出现次数 )
*如果存在「某文件中完全没有出现某类载具」的情况(比如某文件没有Sea类目标),上面的代码会默认忽略这类缺失,不会把该文件的对应类型按0次计入平均。如果需要把这类场景按0次统计,在合并结果后补全所有文件-类型的组合即可:
library(tidyr) all_file_count <- bind_rows(listVeh.data, .id = "file_id") %>% complete(file_id, Entity.Type, fill = list(n = 0))
补全后再执行后续分组求均值的代码,得到的结果会更准确。
方案2:简化迭代写法,无需手写for循环
直接用purrr包的迭代函数处理列表,流程更紧凑:
library(dplyr) library(purrr) library(tidyr) avg_result <- listFinal.data %>% # 逐个文件完成过滤、计数 map(~ .x %>% filter(Entity.Type != "Lifeform") %>% count(Entity.Type, name = "n")) %>% # 合并结果、补全缺失的类型组合、缺失计数填0 bind_rows(.id = "file_id") %>% complete(file_id, Entity.Type, fill = list(n = 0)) %>% # 分组计算均值 group_by(Entity.Type) %>% summarise( total_occur = sum(n), avg_occur_per_file = mean(n) )
用你给出的单文件示例数据测试,单步计数输出为Ground=5、Air=3、Sea=2,和你预期的单文件统计结果一致,核心计数逻辑没有问题。
内容的提问来源于stack exchange,提问作者G Adams
相关产品推荐
相关产品推荐

