rename_with 在 purrr::map2 中不起作用 - 错误“!...列表包含的元素少于 2 个”

des*_*hen 5 r rename list purrr tidyverse

另一项看似简单的任务却给purrr::map2我带来了困难。

\n

我有一个数据框列表和一个列名称向量。我现在想使用各自的新列名称重命名每个数据框中的特定列。所以我想简单地用 循环它map2,但出现错误。我究竟做错了什么?

\n
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.\n
Run Code Online (Sandbox Code Playgroud)\n

我还尝试了 的不同变体.y,例如!!.y等paste0(sym(.y))所有可能的组合 - 没有成功。

\n

预期的输出将是与输入相同的列表,只是第一个数据帧现在有一个列“test1”,第二个数据帧有一个列“test2”。

\n

sta*_*rja 5

您有 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)


Dar*_*sai 5

您对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)