You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:09:31