R语言中对非标准命名数据框列表应用自定义函数的问题
解决方法
问题根源
你传入函数的是数据框名称的字符串,而group_by需要的是数据框对象,因此触发类型不匹配错误。以下是两种可行的批量处理方案:
方案一:基于字符列表+get()函数修正循环
先修改自定义函数,让它直接接受数据框名称参数(避免deparse(substitute(x))在传入get()时失效):
check_summary_df <- function(x, df_name) { # 注意:数据框列名带空格,需用反引号包裹 summarized_data <- x %>% group_by(`Place of collection`, `Days since sample collection`) %>% summarize(count = n(), .groups = "drop") # .groups参数消除分组残留警告 summarized_data$df_name <- df_name return(summarized_data) }
再修改循环,用get()把字符串转换成对应的数据框对象:
# 初始化结果列表 result_list <- list() # 遍历字符列表 for (i in seq_along(input_df_list)) { current_df <- get(input_df_list[i]) result_list[[i]] <- check_summary_df(current_df, input_df_list[i]) } # 合并所有汇总结果 final_summary <- dplyr::bind_rows(result_list)
方案二:直接使用数据框列表(更推荐)
放弃字符列表,直接把数据框存入列表并命名,配合purrr包的批量处理函数更高效:
# 1. 创建数据框列表并命名 input_df_list <- list( df1 = df1, collected_by_x = collected_by_x, collected_by_y = collected_by_y ) # 2. 用purrr::imap_dfr批量处理并合并结果 library(purrr) library(dplyr) final_summary <- input_df_list %>% imap_dfr(function(df, df_name) { df %>% group_by(`Place of collection`, `Days since sample collection`) %>% summarize(count = n(), .groups = "drop") %>% mutate(df_name = df_name) })
注意事项
- 确保函数中的列名和数据框实际列名完全匹配:你的数据框列名带空格(如
Place of collection),必须用反引号``包裹,或者提前将列名改为蛇形命名(如place_of_collection)避免报错。 summarize后添加.groups = "drop"可以避免分组残留的警告信息。
内容的提问来源于stack exchange,提问作者Karthik Nair
相关产品推荐
相关产品推荐

