在 dplyr::mutate 中,dplyr::starts_with 适用于 .before 但不适用于 .after?

问题描述 投票:0回答:1

有人可以解释为什么在下面的上下文中, 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 之后插入新变量

r dplyr tidyverse tidyr tidyselect
1个回答
0
投票

我相信这是因为您使用

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

© www.soinside.com 2019 - 2024. All rights reserved.