在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
相关产品推荐
相关产品推荐

