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

如何从列表中筛选出年份完全一致的多个时间序列数据框

筛选列表中年份完全相同的数据框

首先先还原你构造数据框列表的代码(我把变量名c改成了c_list,避免和R内置的合并函数c()冲突):

# 构造第一个数据框
Year<- c(1984, 1999, 2002, 2005, 2010)
Val <- c(2,1,4,5,4)
df1 <- cbind.data.frame(Year, Val)

# 构造第二个数据框
Year<- c(1934, 1989, 2012, 2015, 2000)
Val <- c(1,5,3,2,1)
df2 <- cbind.data.frame(Year, Val)

# 构造第三个数据框
Year <- c(1984, 1999, 2002, 2005, 2010)
Val <- c(5,7,8,3,4.5)
df3 <- cbind.data.frame(Year, Val)

# 组成数据框列表
c_list <- list(df1, df2, df3)

接下来要筛选出年份完全相同的数据框(不管年份在数据框里的顺序如何),这里提供两种实用方法:

方法一:基础R原生实现

核心思路是给每个数据框生成一个「年份特征标识」——把年份列排序后转成字符串,这样只要年份集合完全一致,标识就会相同。接着筛选出标识重复的数据框:

# 1. 为每个数据框生成排序后的年份字符串标识
year_ids <- sapply(c_list, function(df) toString(sort(df$Year)))

# 2. 找出重复出现的年份标识
repeat_year_ids <- names(table(year_ids)[table(year_ids) > 1])

# 3. 筛选符合条件的数据框到新列表d_list
d_list <- c_list[year_ids %in% repeat_year_ids]

# 查看结果
d_list

运行后你会看到d_list里包含了df1和df3,这两个数据框的年份集合完全一致。

方法二:Tidyverse风格实现

如果你习惯用dplyr和purrr的管道式写法,可以用更流畅的代码完成需求:

library(tidyverse)

d_list <- c_list %>%
  # 为每个数据框绑定年份标识,并保留原数据框对象
  map_dfr(~ tibble(df = list(.x), year_id = toString(sort(.x$Year))), .id = "list_index") %>%
  # 筛选出标识重复的记录
  filter(year_id %in% year_id[duplicated(year_id)]) %>%
  # 提取数据框组成新列表
  pull(df)

# 查看结果
d_list

这个方法逻辑和基础R版本一致,只是用tidyverse的函数把步骤串联起来,代码可读性更强,适合熟悉现代R编程风格的用户。

内容的提问来源于stack exchange,提问作者Sayantan4796

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:57:29