r - 如何在 dplyr::mutate() 的 RHS 上使用动态变量?

标签 r tidyverse dplyr

是否可以在 dplyr::mutate() 的 RHS 上使用动态变量?

玩具示例:

temp <- tibble(
  bl = c(1,2,3,4,5),
  fu = c(11,22,33,44,55)
)

bl_var = "bl"
replacement_var = "fu"

# I want a dynamic version of this:
temp %>%
  mutate(bl = fu)

# Something like:
temp %>%
  mutate(!!bl := !!fu)

在我的实际用例中,我有一组在基线时测量的变量,以及另一组在某个后续时期测量的变量。我不想将小标题旋转得更久,但想用后续变量替换基线变量。

变量有一致的命名方案:

基线变量可能是:x_1、x_2、x_3、...

后续变量将为:x_fu_1, x_fu_2, x_fu_3, ...

感谢@akrun 提供了简洁的解决方案。对于具有类似情况的其他人,我修改了他们的解决方案,将更新的基线变量连接回原始数据:

map2_dfc(baseline, followup, ~ temp %>%
  group_by_at(vars(!! row_id)) %>%
    transmute(!! .y := !! rlang::sym(.x))) %>%
right_join(temp, by = row_id)

最佳答案

由于它是一个字符串,我们可以转换为 symbol 并求值 (!!) 来获取对象的值

library(dplyr)
temp %>%
   mutate(!!bl_var := !! rlang::sym(replacement_var))
# A tibble: 5 x 2
#     bl    fu
#  <dbl> <dbl>
#1    11    11
#2    22    22
#3    33    33
#4    44    44
#5    55    55

如果我们有多个变量,请为每个变量创建一个向量,然后使用 mapfor 循环执行此操作

library(stringr)
baseline <- str_c("x", 1:3, sep="_")
followup <- str_c("x_fu", 1:3, sep="_")
for(i in seq_along(baseline)) {
     temp <- temp %>%
                mutate(!! followup[i] := !! rlang::sym(baseline[i]) * 5)

    }

或者使用map2

library(purrr)
map2_dfc(baseline, followup, ~ temp %>%
                              transmute(!! .y := !! rlang::sym(.x) * 5)) %>%
    bind_cols(temp, .)

还有其他选项,例如 _attransmute_atmutate_atmutate/across 可以接受字符串作为列名称

关于r - 如何在 dplyr::mutate() 的 RHS 上使用动态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61760056/

相关文章:

r - 如何在 R 中创建具有相等随机分布的数据子集

r - 防止 tibble 缩写列名

r - 在 group_by() 之后获取 count() 以获取非缺失值

r - 在 unnest_wider 之后命名提升向量中的列

r - 自动将二进制变量编码为因子?

r - 使用 ggplot2 绘制样条函数

r - 计算比较连续时间段的值的函数

使用跨替换 group_by_at(NULL)

r - 获取组的行号,但条件为 R

R:检查向量的多个元素是否出现在字符串向量中