R语言遍历dataframe列表计算列均值与行数的报错问题
问题排查与解决
问题根源
你存储的DoublePostsLeftDFs是字符串向量,仅保存了dataframe的变量名称,不是实际的dataframe对象:
- 第一次报错是因为你直接对字符串类型的变量名使用
$运算符,字符串属于原子向量,本身不支持$操作 - 第二次将字符串强制转dataframe,只是把单个字符串转成了1行1列的临时dataframe,所以行数永远是1,也不存在你需要的
desired_column字段,求和结果自然为0
方案1:最小改动修复现有代码
遍历的时候通过get()函数,根据变量名字符串获取全局环境中对应的实际dataframe对象即可:
for (x in DoublePostsLeftDFs) { # 读取字符串对应的实际dataframe df <- get(x) row_number <- nrow(df) # 直接用内置mean函数更简洁,na.rm=TRUE可过滤空值避免计算报错,不需要可以删除 average <- mean(df$desired_column, na.rm = TRUE) print(paste("数据集", x, "行数:", row_number)) print(paste("数据集", x, "目标列均值:", average)) }
方案2:更规范的实现(推荐)
不要用assign把零散的dataframe分散存入全局环境,直接把过滤后的dataframe存在命名列表中,后续维护和操作更方便,也不会污染全局环境变量:
library(stringr) library(dplyr) Coverages <- list('Cover 0', 'Cover 1', 'Cover 2', 'Cover 3') # 初始化空列表存储所有dataframe DoublePostsLeftDFs <- list() for (x in Coverages) { df_name <- paste("DoublePostsLeft", str_replace_all(x, " ", ""), sep="") # 直接将过滤后的df存入列表并对应命名 DoublePostsLeftDFs[[df_name]] <- DoublePostsLeft %>% filter(CoverageScheme == x) } # 遍历列表完成计算 for (df_name in names(DoublePostsLeftDFs)) { df <- DoublePostsLeftDFs[[df_name]] row_number <- nrow(df) average <- mean(df$desired_column, na.rm = TRUE) print(paste("数据集", df_name, "行数:", row_number)) print(paste("数据集", df_name, "目标列均值:", average)) }
内容的提问来源于stack exchange,提问作者Loons22
相关产品推荐
相关产品推荐

