我们真的可以将两组多个变量传递给 dplyr 中的 mutate across 吗?
Can we actually pass two sets of multiple variables into mutate across in dplyr
这个 虽然有三个答案让我怀疑,因为我正在考虑这个问题。虽然我知道问题可以通过其他方法解决(尤其是使用 purrr 或 apply 函数组),但我不确定是否可以通过 mutate(across(...
实际完成?为了清楚起见,我在这里重现了这个问题。 注:我不是在寻找它的答案,只是在解答我对两组变量是否真的可以通过mutate/across
的疑惑
有两组变量(一组没有后缀,一组有后缀avail)。
df <- tibble(a = c(0, 1, 0, 0, 0),
a_avail = c(1, 1, 1, 0, 0),
b = c(1, 1, 1, 0, 0),
b_avail = c(1, 0, 0, 1, 0))
# A tibble: 5 x 4
a a_avail b b_avail
<dbl> <dbl> <dbl> <dbl>
1 0 1 1 1
2 1 1 1 0
3 0 1 1 0
4 0 0 0 1
5 0 0 0 0
现在如果我们想改变一组变量,比如(a 和 b),但是通过将它们与另一组串联进行比较。也就是说,当 a 列发生变异时,它可能会使用其对应的变量 a_avail,而当 b 列发生变异时,它是 b_avail
等等,直到 n 个变量。
除了 OP 之外,我已经尝试了这些代码
df %>% mutate(d = row_number()) %>%
mutate(across(.cols = c(a_avail, b_avail),
.fns = ~case_when(
.x == 1 ~ {str_replace(cur_column(), "_avail", "")[d]},
.x == 0 ~ NA_character_
),
.names = "{.col}_new"))
或
df %>%
mutate(across(.cols = c(a, b),
.fns = ~case_when(
glue::glue("{cur_column()}_avail") == 1 ~ .x,
glue::glue("{cur_column()}_avail") == 0 ~ as.numeric(NA)
),
.names = "{.col}_new"))
但无济于事。有人可以澄清是否可以通过 mutate(across.. syntax?
你可以用 get
和 cur_column()
来做到这一点。
library(dplyr)
df %>%
mutate(across(.cols = c(a, b),
.fns = ~case_when(
get(glue::glue("{cur_column()}_avail")) == 1 ~ .x,
get(glue::glue("{cur_column()}_avail")) == 0 ~ as.numeric(NA)
),
.names = "{.col}_new"))
# a a_avail b b_avail a_new b_new
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 0 1 1 1 0 1
#2 1 1 1 0 1 NA
#3 0 1 1 0 0 NA
#4 0 0 0 1 NA 0
#5 0 0 0 0 NA NA
PS - 我不确定这是否应该是您链接的 post 的答案。
这个 mutate(across(...
实际完成?为了清楚起见,我在这里重现了这个问题。 注:我不是在寻找它的答案,只是在解答我对两组变量是否真的可以通过mutate/across
有两组变量(一组没有后缀,一组有后缀avail)。
df <- tibble(a = c(0, 1, 0, 0, 0),
a_avail = c(1, 1, 1, 0, 0),
b = c(1, 1, 1, 0, 0),
b_avail = c(1, 0, 0, 1, 0))
# A tibble: 5 x 4
a a_avail b b_avail
<dbl> <dbl> <dbl> <dbl>
1 0 1 1 1
2 1 1 1 0
3 0 1 1 0
4 0 0 0 1
5 0 0 0 0
现在如果我们想改变一组变量,比如(a 和 b),但是通过将它们与另一组串联进行比较。也就是说,当 a 列发生变异时,它可能会使用其对应的变量 a_avail,而当 b 列发生变异时,它是 b_avail
等等,直到 n 个变量。
除了 OP 之外,我已经尝试了这些代码
df %>% mutate(d = row_number()) %>%
mutate(across(.cols = c(a_avail, b_avail),
.fns = ~case_when(
.x == 1 ~ {str_replace(cur_column(), "_avail", "")[d]},
.x == 0 ~ NA_character_
),
.names = "{.col}_new"))
或
df %>%
mutate(across(.cols = c(a, b),
.fns = ~case_when(
glue::glue("{cur_column()}_avail") == 1 ~ .x,
glue::glue("{cur_column()}_avail") == 0 ~ as.numeric(NA)
),
.names = "{.col}_new"))
但无济于事。有人可以澄清是否可以通过 mutate(across.. syntax?
你可以用 get
和 cur_column()
来做到这一点。
library(dplyr)
df %>%
mutate(across(.cols = c(a, b),
.fns = ~case_when(
get(glue::glue("{cur_column()}_avail")) == 1 ~ .x,
get(glue::glue("{cur_column()}_avail")) == 0 ~ as.numeric(NA)
),
.names = "{.col}_new"))
# a a_avail b b_avail a_new b_new
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 0 1 1 1 0 1
#2 1 1 1 0 1 NA
#3 0 1 1 0 0 NA
#4 0 0 0 1 NA 0
#5 0 0 0 0 NA NA
PS - 我不确定这是否应该是您链接的 post 的答案。