我有一个命名列表,在该列表中我想根据列表的来源名称重命名它们的列。
我的方法的问题似乎是 .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/