如何用purrr::map2将列表中数据框的列添加到另一列表对应数据框
解决方案
你的核心需求是将两个等长列表中对应位置的数据框合并,同时重命名指定列。原代码的问题在于错误地将赋值语句直接传给map2的.f参数,.f需要接收一个处理函数而非赋值操作,且无需嵌套lapply。以下是几种可行的实现方式:
方法一:使用purrr + dplyr(代码更清晰)
借助purrr::map2并行处理两个列表的对应元素,结合dplyr的列操作函数实现需求:
library(purrr) library(dplyr) desired_list <- map2(list1, list2, function(df1, df2) { # 重命名list1的colB为colB_1 df1_renamed <- rename(df1, colB_1 = colB) # 提取list2的colB并重命名为colB_2 df2_col <- df2 %>% select(colB) %>% rename(colB_2 = colB) # 合并两个数据框 bind_cols(df1_renamed, df2_col) })
也可以写成更简洁的公式风格:
desired_list <- map2(list1, list2, ~ bind_cols( rename(.x, colB_1 = colB), .y %>% select(colB) %>% rename(colB_2 = colB) ))
方法二:Base R实现(无需额外包)
如果不想加载第三方包,用mapply也能完成:
desired_list <- mapply(function(df1, df2) { # 重命名list1的colB为colB_1 names(df1)[names(df1) == "colB"] <- "colB_1" # 添加list2的colB作为colB_2 df1$colB_2 <- df2$colB df1 }, list1, list2, SIMPLIFY = FALSE)
验证结果
运行上述代码后,desired_list的结构和数据完全符合预期:
# 查看第一个数据框 desired_list[[1]] # colA colB_1 colB_2 # 1 A 1 11 # 2 B 2 12 # 3 C 3 13 # 4 D 4 14 # 5 E 5 15
内容的提问来源于stack exchange,提问作者LT17
相关产品推荐
相关产品推荐

