使用 purrr 根据列表名称重命名列表列

标签 r list purrr

我有一个命名列表,在该列表中我想根据列表的来源名称重命名它们的列。

我的方法的问题似乎是 .x 占位符,我认为它是我唯一的列表名称。但在 rename_with 函数中,.x 似乎是在每个列表数据框中计算的,而不是来自原始 .x。有什么办法可以继承原来的 .x(或列表名称)进行重命名吗?

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 = ~my_list[names(my_list) == .x] |> 
               dplyr::bind_rows() |> 
               dplyr::rename_with(.cols = "x",
                                  .fn   = ~paste0("new_", .x)))

预期输出:

[[1]]
  new_L1
1     1
2     2
3     3
4     1
5     2
6     3

[[2]]
  new_L2
1     1
2     2
3     3
4     1
5     2
6     3

最佳答案

只修改2个地方:

  • 您已经为 map() 设置了 .x.f,所以第一行 (my_list | >) 是多余的。它使 my_list 被扔进 map()... 部分,这对什么都不起作用。

  • rename_with().fn部分,如果使用公式式函数,占位符.x会冲突。所以你应该使用一个基本函数并设置一个不同的参数名称。

purrr::map(.x = unique(names(my_list)),
           .f = ~ my_list[names(my_list) == .x] |> 
                  dplyr::bind_rows() |> 
                  dplyr::rename_with(.cols = "x",
                                     .fn   = \(col) paste0("new_", .x)))

[[1]]
  new_L1
1      1
2      2
3      3
4      1
5      2
6      3

[[2]]
  new_L2
1      1
2      2
3      3
4      1
5      2
6      3

你也可以使用rename这样你就不用担心冲突了。

|> dplyr::rename(!!paste0("new_", .x) := x)

关于使用 purrr 根据列表名称重命名列表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73288156/

相关文章:

r - 如何通过 purrr::pmap 将参数从 tibble 正确传递到函数中

r - NGramTokenizer 未按预期工作

python - 将字符串添加到 python 列表的每个元素

C# 循环遍历 List<dictionary<string,string>> 来填充 DataTable

在包含 unicode 字符串的列表上调用 remove() 时,Python 给出 UnicodeWarning

运行 `.x` 函数后用列名替换 `map::purrr()`

R:如何连接向量列表中的字符串向量

R 控制台 : single line instructions vs multiple lines instructions

r - 保留该列表(在 R 中)内没有适当子集的元素(来自向量列表)

r - 在字符串列表上映射 str_detect 以检测第二个字符串列表