使用purrr根据列表名称重命名列表内数据框列名的问题
解决命名列表数据框列重命名的作用域问题
你的问题核心是作用域混淆:rename_with的.fn参数里的.x是该函数自身的参数(指代被处理的列名),而非外层map中代表列表名称的.x。要解决这个问题,只需要把外层的列表名称变量明确传递到内层,避免名称冲突。
以下是几种可行的解决方案:
方法1:使用匿名函数明确变量
最直观的方式是用匿名函数代替公式写法,给外层列表名称起个清晰的变量名,内层直接引用:
my_list <- list(L1 = data.frame(x=1:3), L1 = data.frame(x=1:3), L2 = data.frame(x=1:3), L2 = data.frame(x=1:3)) my_list |> purrr::map(.x = unique(names(my_list)), .f = function(list_name) { my_list[names(my_list) == list_name] |> dplyr::bind_rows() |> dplyr::rename_with(.cols = "x", .fn = ~paste0("new_", list_name)) })
方法2:公式写法中显式保存变量
如果偏好公式写法,可以在公式块里先把外层.x存成新变量,再在内层使用:
my_list |> purrr::map(.x = unique(names(my_list)), .f = ~{ current_name <- .x my_list[names(my_list) == .x] |> dplyr::bind_rows() |> dplyr::rename_with(.cols = "x", .fn = ~paste0("new_", current_name)) })
方法3:使用rlang注入变量
利用rlang的注入语法(!!),直接把外层.x注入到内层函数中:
my_list |> purrr::map(.x = unique(names(my_list)), .f = ~my_list[names(my_list) == .x] |> dplyr::bind_rows() |> dplyr::rename_with(.cols = "x", .fn = ~paste0("new_", !! .x)))
这三种方法都能让rename_with正确使用外层的列表名称来重命名列,得到你想要的输出。
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

