You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:45:04