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

在R中统计CSV列值次数时遇'incapacitated_count未找到'错误求助

问题描述

我有多个列结构完全相同的大型CSV文件,已读入R语言的listFinal.data列表中。统计Biological.Stage列中各值出现次数的代码正常运行,但统计Incapacitation.Status列中"Incapacitated"和"Not Incapacitated"的出现次数时,报错:

Error in incapacitated_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Incapacitation.Status ==  : object 'incapacitated_count' not found

完整代码

library(tidyverse)
library(ggplot2)
library(rlist)
library(magrittr)
library(DT)
library(readr)
library(dplyr)
 

options(shiny.maxRequestSize = 200*1024^2)

wd <<- choose.dir(caption = "Select top level folder where your data is located")
setwd(wd)

#List the full path and filename of all files in the working directory and sub-directories that starts
#with "BioModel_" and ends with ".csv"
out_files <- list.files(pattern = "^BioModel(.*)csv$", recursive = TRUE)

# create an empty list that will serve as a container to receive the incoming files
list.data<-list()
listForceFinal.data<-list()
listForceInitial.data<-list()
outputInitial.data<-list()
listOcularFinal.data<-list()
listInhalationFinal.data<-list()
listSurfaceFinal.data<-list()
listChemFinal.data<-list()
listBioFinal<-list()
listFatalities.data<-list()
listFinal.data<-list()
listContaminatedVeh.data<-list()
none_count<-list()
minor_count<-list()
major_count<-list()
lethal_count<-list()
incubation_count<-list()
symptomatic_count<-list()
convalescence_count<-list()
incubation_count<-list()
vehicle_count<-list()
incapacitation_count<-list()
# 
 num_reps <- length(out_files)

# create a loop to read in your data

for (i in 1:length(out_files))
{
  list.data[[i]]<-read.csv(out_files[i], check.names = TRUE)
}

# # create a loop to get the final contamination level and remove all others
for (h in 1:length(list.data))
  listFinal.data[[h]] <- list.data[[h]] %>%
  group_by(Actor.ID, Actor.Name) %>%
  slice(n())

output <- plyr::ldply(listFinal.data, function(x) x %>%
  group_by(Entity.Type) %>%
  summarise(n=n()))

listContaminatedVeh.data <- output %>%
  filter(Entity.Type != "Lifeform") %>%
  group_by(Entity.Type) %>%
  summarise(Mean.Final = mean(n)) %>%
  rename("Platform Type" = Entity.Type, Mean = Mean.Final)

#Contaminated Entities

#create a loop to sum up the total number of contaminated and incapacitated entities in each rep
for (l in 1:length(listFinal.data)){
  incubation_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "incubation",])
  symptomatic_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "symptomatic",])
  convalescence_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "convalescence",])
  incapacitated_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Incapacitation.Status == "Incapacitated",])
}

# calculate the average number of entities with biological contamination / incapacitation across all reps
result.incubationAvg <- mean(as.numeric(incubation_count))
result.incubationAvg <- round(result.incubationAvg)

result.symptomaticAvg <- mean(as.numeric(symptomatic_count))
result.symptomaticAvg <- round(result.symptomaticAvg)

result.convalescenceAvg <- mean(as.numeric(convalescence_count))
result.convalescenceAvg <- round(result.convalescenceAvg)

result.incapacitationAvg <- mean(as.numeric(incapacitation_count))
result.incapacitationAvg <- round(result.incapacitationAvg)

样本数据

df <- read.table(text = "
Time Stamp,Biological Stage,Contaminant Type,Incapacitation Status,Concentration of Agent  
13206478,symptomatic,biological,Incapacitated,8.38E-05  
13087148,none,biological,Not Incapacitated,0  
12966365,none,biological,Not Incapacitated,0  
13207078,none,biological,Not Incapacitated,8.38E-05  
", header = TRUE, sep = ",")

问题排查与解决

1. 核心错误:变量名拼写不一致

你初始化的变量是incapacitation_count(名词形式,无末尾d),但循环中赋值时误写为incapacitated_count(形容词形式,带末尾d),导致R找不到未定义的incapacitated_count对象。

修复方法

将循环中的变量名统一为初始化时的incapacitation_count:

for (l in 1:length(listFinal.data)){
  incubation_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "incubation",])
  symptomatic_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "symptomatic",])
  convalescence_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Biological.Stage == "convalescence",])
  # 修正变量名,从incapacitated_count改为incapacitation_count
  incapacitation_count[[l]] <- nrow(listFinal.data[[l]][listFinal.data[[l]]$Incapacitation.Status == "Incapacitated",])
}

后续计算平均值的代码result.incapacitationAvg <- mean(as.numeric(incapacitation_count))是正确的,无需修改。

2. 额外优化建议

(1)删除重复定义的变量

代码中重复定义了incubation_count<-list()两次,建议删除其中一行,避免逻辑混淆。

(2)用dplyr简化统计逻辑

可以用purrr结合dplyr替代循环,代码更简洁且不易出错:

# 一次性统计所有需要的指标
stats_list <- map(listFinal.data, function(df) {
  tibble(
    incubation = sum(df$Biological.Stage == "incubation"),
    symptomatic = sum(df$Biological.Stage == "symptomatic"),
    convalescence = sum(df$Biological.Stage == "convalescence"),
    incapacitated = sum(df$Incapacitation.Status == "Incapacitated")
  )
})

# 转换为数据框并计算平均值
stats_df <- bind_rows(stats_list)
result_avg <- stats_df %>% summarise(
  incubationAvg = round(mean(incubation)),
  symptomaticAvg = round(mean(symptomatic)),
  convalescenceAvg = round(mean(convalescence)),
  incapacitationAvg = round(mean(incapacitated))
)

# 提取结果
result.incubationAvg <- result_avg$incubationAvg
result.symptomaticAvg <- result_avg$symptomaticAvg
result.convalescenceAvg <- result_avg$convalescenceAvg
result.incapacitationAvg <- result_avg$incapacitationAvg

(3)验证列名一致性

虽然你用check.names = TRUE将空格转为点,但可以提前验证所有数据框的列名是否一致:

# 检查所有数据框的列名是否相同
all_colnames_equal <- all(map_lgl(listFinal.data, ~ identical(colnames(.), colnames(listFinal.data[[1]]))))
if (!all_colnames_equal) warning("部分数据框列名不一致!")

内容的提问来源于Stack Exchange,提问作者G Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:17:04