R/Tidyverse面板数据查找跨所有波次均存在的ID的实现方法
基于Tidyverse的简洁实现方案
核心逻辑用purrr::reduce替代手写多轮inner_join,原生适配你已构建的嵌套tibble结构,无需额外格式转换,20+波次场景下也能高效运行。
步骤1:先对波次数据按编号排序
确保波次顺序正确,避免后续筛选起始波次时出错:
library(tidyverse) # 提取波次数字编号,按顺序排序 data_sorted <- data %>% mutate(wave_num = as.integer(str_remove(df, "wave"))) %>% arrange(wave_num)
步骤2:核心需求实现
需求1:查询所有波次共有的ID及数量
# 提取所有波次的id列,迭代执行inner_join得到共有ID common_all_id <- data_sorted$file_content %>% map(~select(.x, id)) %>% # 仅保留id列大幅提升计算效率 reduce(inner_join, by = "id") # 共有ID数量 nrow(common_all_id) # 如需输出ID向量直接pull即可 common_all_id %>% pull(id)
需求2:查询某起始波次及后续所有波次共有的ID及数量
封装为通用函数,输入起始波次编号即可直接调用:
get_common_from_wave <- function(start_wave_num) { data_sorted %>% filter(wave_num >= start_wave_num) %>% # 筛选起始波次及之后的所有数据 pull(file_content) %>% map(~select(.x, id)) %>% reduce(inner_join, by = "id") } # 示例:查询wave2及之后所有波次共有的ID数量 nrow(get_common_from_wave(2)) # 示例:查询wave1及之后所有波次共有的ID,和需求1结果一致 nrow(get_common_from_wave(1))
步骤3:批量统计所有起始波次的共有ID数量
一次性输出所有起始波次对应的共有ID数,无需多次手动调用:
stat_result <- data_sorted %>% rowwise() %>% summarise( 起始波次 = df, 后续波次共有ID数量 = nrow(get_common_from_wave(wave_num)) ) print(stat_result)
内容的提问来源于stack exchange,提问作者Björn
相关产品推荐
相关产品推荐

