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

col17t5w  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(131)

另一个看似简单的任务,purrr::map2给了我一个艰难的时刻。
我有一个数据框列表和一个列名称向量,现在我想用新的列名称重命名每个数据框中的某个列,所以我只想用map2循环,但是得到一个错误,我做错了什么?

new_names <- c("test1", "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))

# Error in `map2()`:
# ℹ In index: 1.
# Caused by error in `.fn()`:
# ! the ... list contains fewer than 2 elements
# Run `rlang::last_error()` to see where the error occurred.

我还尝试了.y的不同变体,例如!!.ypaste0(sym(.y))等所有可能的组合-没有成功。
期望的输出将是与输入相同的列表,只是第一个 Dataframe 现在具有列“test1”,第二个 Dataframe 具有列“test 2”。

yc0p9oo0

yc0p9oo01#

您对map2.frename_with.fn都使用了带有 * purrr样式lambda* 的匿名函数,并且它们相互冲突,您需要显式指定一个参数名称,即将.fn = ~ .y更改为.fn = \(nms) .y

map2(.x = df_list,
     .y = new_names,
     .f = ~ .x |> 
       rename_with(.cols = everything(),
                   .fn   = \(nms) .y))
xu3bshqb

xu3bshqb2#

你有两个问题:

  • rename_with需要函数,而不是向量
  • 你得到的错误是由于使用~.y,而只有.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))

或者,我只使用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
     })
tez616oj

tez616oj3#

我们可以使用rename()右侧的数字来指定要重命名的列号,因此我只使用map2()rename()(而不是rename_with)。

library(purrr)
library(dplyr)

map2(df_list,
     new_names,
     \(df, col) rename(df, !! col := 1)
     )

#> [[1]]
#>    test1
#> 1   21.0
#> 2   21.0
#> 3   22.8
#> 4   21.4
#> 5   18.7
#> ...
#> 
#> [[2]]
#>    test2
#> 1      6
#> 2      6
#> 3      4
#> 4      6
#> 5      8
#> ...

数据来自OP

new_names <- c("test1", "test2")

df_list <- list(data.frame(mtcars[, 1]),
                data.frame(mtcars[, 2]))

reprex package(v2.0.1)于2023年3月6日创建

相关问题