按ID重新调整列表层级:跨列表元素分组整合数据
解决方案
针对你需要将多个结构不同的Data Frame按ID重新组织、整合数据并应用自定义函数的需求,这里提供两种实用方法:
方法一:合并后按ID分组(适合统一汇总场景)
先给列表元素命名,为每个Data Frame添加来源标识,合并后按ID分组,再应用自定义函数。
步骤代码:
- 给列表命名,明确每个元素的来源:
names(food) <- c("fruit", "veg", "milk")
- 添加来源列并合并所有Data Frame:
library(dplyr) library(purrr) # 为每个df添加source列,然后合并成大df combined_df <- imap_dfr(food, ~ mutate(.x, source = .y)) # 按id分组 grouped_data <- group_by(combined_df, id)
- 定义并应用自定义汇总函数:
比如计算每个ID的总消费、各来源记录数:
custom_summary <- function(group) { tibble( id = unique(group$id), total_consumed = sum(group$consumed, na.rm = TRUE), fruit_count = sum(group$source == "fruit"), veg_count = sum(group$source == "veg"), milk_count = sum(group$source == "milk") ) } # 生成汇总结果 summary_output <- grouped_data %>% group_modify(custom_summary)
方法二:按ID拆分列表(适合精细化处理场景)
直接将每个Data Frame按ID拆分,再整合同一ID下的所有来源数据,形成以ID为层级的结构,方便逐个处理。
步骤代码:
- 按ID拆分每个Data Frame:
# 把每个df拆成以id为键的子列表 split_list <- map(food, ~ split(.x, .x$id))
- 整合同一ID的多来源数据:
# 生成以id为名称的列表,每个元素对应该id的所有数据(带source标识) id_merged_list <- map(names(split_list[[1]]), function(id_val) { map_dfr(split_list, ~ .x[[id_val]], .id = "source") }) names(id_merged_list) <- names(split_list[[1]])
- 对每个ID的数据应用自定义函数:
比如计算各来源的消费均值:
process_single_id <- function(data) { data %>% group_by(source) %>% summarise(avg_consumed = mean(consumed, na.rm = TRUE)) } # 批量处理所有ID all_id_results <- map(id_merged_list, process_single_id)
内容的提问来源于stack exchange,提问作者heikeehee
相关产品推荐
相关产品推荐

