另一个看似简单的任务,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
的不同变体,例如!!.y
、paste0(sym(.y))
等所有可能的组合-没有成功。
期望的输出将是与输入相同的列表,只是第一个 Dataframe 现在具有列“test1”,第二个 Dataframe 具有列“test 2”。
3条答案
按热度按时间yc0p9oo01#
您对
map2
的.f
和rename_with
的.fn
都使用了带有 * purrr样式lambda* 的匿名函数,并且它们相互冲突,您需要显式指定一个参数名称,即将.fn = ~ .y
更改为.fn = \(nms) .y
。xu3bshqb2#
你有两个问题:
rename_with
需要函数,而不是向量~.y
,而只有.y
可以工作。我猜这是由于purrr/dplyr的求值中的小问题如果提供函数列表作为输入,则可以使用代码:
或者,我只使用
colnames
:tez616oj3#
我们可以使用
rename()
右侧的数字来指定要重命名的列号,因此我只使用map2()
和rename()
(而不是rename_with
)。数据来自OP
由reprex package(v2.0.1)于2023年3月6日创建