des*_*hen 5 r rename list purrr tidyverse
另一项看似简单的任务却给purrr::map2我带来了困难。
我有一个数据框列表和一个列名称向量。我现在想使用各自的新列名称重命名每个数据框中的特定列。所以我想简单地用 循环它map2,但出现错误。我究竟做错了什么?
new_names <- c("test1", "test2")\n\ndf_list <- list(data.frame(mtcars[, 1]),\n data.frame(mtcars[, 2]))\n\nmap2(.x = df_list,\n .y = new_names,\n .f = ~.x |> \n rename_with(.cols = everything(),\n .fn = ~.y))\n\n# Error in `map2()`:\n# \xe2\x84\xb9 In index: 1.\n# Caused by error in `.fn()`:\n# ! the ... list contains fewer than 2 elements\n# Run `rlang::last_error()` to see where the error occurred.\nRun Code Online (Sandbox Code Playgroud)\n我还尝试了 的不同变体.y,例如!!.y等paste0(sym(.y))所有可能的组合 - 没有成功。
预期的输出将是与输入相同的列表,只是第一个数据帧现在有一个列“test1”,第二个数据帧有一个列“test2”。
\n您有 2 个问题:
rename_with需要一个函数,而不是一个向量~.y, while 仅.y有效。我猜这是由于 purrr/dplyr 的评估出现问题如果您提供函数列表作为输入,则可以使用您的代码:
new_names <- list(function(x) {"test1"}, function(x) {"test2"})
df_list <- list(data.frame(mtcars[, 1]),
data.frame(mtcars[, 2]))
map2(.x = df_list,
.y = new_names,
.f = ~.x %>%
rename_with(.cols = everything(),
.fn = .y))
Run Code Online (Sandbox Code Playgroud)
或者,我只使用colnames:
new_names <- c("test1", "test2")
df_list <- list(data.frame(mtcars[, 1]),
data.frame(mtcars[, 2]))
map2(.x = df_list,
.y = new_names,
.f = function(df, new_name) {
colnames(df)[1] <- new_name
df
})
Run Code Online (Sandbox Code Playgroud)
您对of和of 都使用带有purrr 样式 lambda 的匿名函数,并且它们相互冲突。您需要显式指定参数名称,即更改为..fmap2.fnrename_with.fn = ~ .y.fn = \(nms) .y
map2(.x = df_list,
.y = new_names,
.f = ~ .x |>
rename_with(.cols = everything(),
.fn = \(nms) .y))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |