R语言pollutantmean函数计算均值报错:参数非数值/逻辑值返回NA
问题原因
你用lapply(filepath, read.csv)得到的df是一个列表,每个列表元素对应一个CSV文件的数据框,不是单个统一的数据框。所以df[[pollutant]]是在列表里找名为sulfate或nitrate的元素,这根本不存在,自然会报错说参数不是数值型。
修正方案
有两种简单的修正方式:
方式一:合并列表为单个数据框
把读取后的列表合并成一个大的数据框,再计算对应污染物的均值:
pollutantmean <- function (directory, pollutant, id = 1:332) { # 读取文件 filenames <- sprintf("%03d.csv",id) filepath <- paste(directory, filenames, sep="/") # 读取所有文件并合并为单个数据框 df_list <- lapply(filepath, read.csv) combined_df <- do.call(rbind, df_list) # 计算均值 mean(combined_df[[pollutant]], na.rm = TRUE) }
方式二:直接提取目标列并计算
不需要合并整个数据框,直接在读取时提取目标列,再合并成向量计算均值:
pollutantmean <- function (directory, pollutant, id = 1:332) { # 读取文件 filenames <- sprintf("%03d.csv",id) filepath <- paste(directory, filenames, sep="/") # 读取每个文件的目标列,合并为向量 pollutant_values <- unlist(lapply(filepath, function(file) { read.csv(file)[[pollutant]] })) # 计算均值 mean(pollutant_values, na.rm = TRUE) }
验证
运行pollutantmean("specdata", "sulfate", 1:10)就能得到正确的均值了。
内容的提问来源于stack exchange,提问作者Chunyi
相关产品推荐
相关产品推荐

