如何从列表中筛选出年份完全一致的多个时间序列数据框
筛选列表中年份完全相同的数据框
首先先还原你构造数据框列表的代码(我把变量名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
相关产品推荐
相关产品推荐

