在R语言中按ID与DATE键合并两个数据框列表的方法求助
用ID和DATE合并R中的两个数据框列表
嘿,我来帮你解决这个合并需求~ 先结合你给出的示例数据,我补全第二个列表的结构(假设它和第一个列表对应ID的时间序列匹配),然后给你两种实用的解决方案:
方法一:合并成单个大数据框
如果希望把两个列表里的所有数据整合到一个大表中,再按ID和DATE匹配,可以这么做:
首先加载需要的包,然后合并列表内的数据,最后进行匹配合并:
library(dplyr) # 补全你未写完的第二个列表示例 names2 <- c("df_auto1", "df_auto2") mydf_auto1 <- data.frame(ID=c(22319, 22319), DATE=c("2011-09-30","2011-10-31"), AUTO_SCORE = c(700, 710)) mydf_auto2 <- data.frame(ID=c(115477, 115477), DATE=c("2012-01-31","2012-02-29"), AUTO_SCORE = c(680, 640)) list2 <- list(mydf_auto1, mydf_auto2) names(list2) <- names2 # 将每个列表内的所有数据框纵向合并成大表,同时保留来源标识 combined_list1 <- bind_rows(list1, .id = "source_df") combined_list2 <- bind_rows(list2, .id = "source_auto_df") # 按ID和DATE进行内连接(只保留两边都有的匹配行,也可以用left_join/right_join调整) merged_data <- inner_join(combined_list1, combined_list2, by = c("ID", "DATE")) # 查看结果 print(merged_data)
运行后你会得到一个包含所有匹配上的ID、DATE、SCORE和AUTO_SCORE的大数据框,还能看到每条数据来自原列表的哪个子数据框。
方法二:保留列表结构,按ID逐一合并
如果想保留原有的列表结构,让每个ID对应的数据框单独合并,可以借助purrr包来实现:
library(purrr) library(dplyr) # 把两个列表的名称改成对应的ID(每个子数据框的ID是唯一的,取第一个即可) names(list1) <- map_chr(list1, ~ unique(.x$ID)) names(list2) <- map_chr(list2, ~ unique(.x$ID)) # 按ID匹配,逐一合并对应的子数据框 merged_list <- map2(list1[names(list2)], list2, ~ inner_join(.x, .y, by = c("ID", "DATE"))) # 查看合并后的列表 print(merged_list)
这样得到的merged_list里,每个元素就是对应ID的合并后数据框,方便后续对单个ID的数据进行单独分析。
你可以根据自己的实际需求选择这两种方法,如果需要调整连接方式(比如保留所有左边的行),只需要把inner_join换成left_join就好啦~
内容的提问来源于stack exchange,提问作者Yelena
相关产品推荐
相关产品推荐

