有人可以解释为什么在下面的上下文中, mutate .beforestarts_with 有效,但 mutate.afterstarts_with 不起作用?
dfr_before <- data.frame(old1=1, old2=1, prefix_old1=1, prefix_old2=1, old3=1)
dfr_after <- dfr_before
newnames <- list("prefix_new1", "prefix_new2")
for (n in newnames) {
dfr_before <- dfr_before |> dplyr::mutate(
.before = dplyr::starts_with("prefix"),
{{n}} := 2
)
dfr_after <- dfr_after |> dplyr::mutate(
.after = dplyr::starts_with("prefix"),
{{n}} := 2
)
}
dfr_before
dfr_after
## old1 old2 prefix_new2 prefix_new1 prefix_old1 prefix_old2 old3
## 1 1 1 2 2 1 1 1
## old1 old2 prefix_old1 prefix_old2 old3 prefix_new1 prefix_new2
## 1 1 1 1 1 1 2 2
我以为它会在 prefix_old2 之后插入新变量
我相信这是因为您使用
mutate()
参数对 .after = starts_with("prefix")
的调用本质上解析为对 mutate()
的调用,然后对 relocate()
的调用。
mutate()
会将新的前缀列放置在帧的末尾,然后relocate()
会将新创建的“前缀”列“移动”到最后一个“前缀”列之后。在这种情况下,最后一个这样的列最终就是它本身。
这是一个简化的表示,说明了该行为:
library(dplyr)
data <- data.frame(a1 = "a1", a2 = "a2", b2 = "b2")
# all together as per your example
data %>% mutate(a3 = "a3", .after = starts_with("a"))
#> a1 a2 b2 a3
#> 1 a1 a2 b2 a3
# stepwise
data %>%
mutate(a3 = "a3") %>%
relocate(a3, .after = starts_with("a"))
#> a1 a2 b2 a3
#> 1 a1 a2 b2 a3
创建于 2024-10-09,使用 reprex v2.1.1