【问题标题】:How to mutate a column in a dataframe dynamically in R如何在 R 中动态地改变数据框中的列
【发布时间】:2023-04-05 14:54:01
【问题描述】:

我想改变定义为变量 (col_name) 的 dataframe/tibble 列的值。我尝试了!!col_name,但没有成功。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
col_name <- "b" # the column to select

df <- tibble(a = c(1,2,3), b = c(2,4,6))

df %>%
  mutate(b = if_else((b == 6 & a == 3), 8, b))  # this works 
#> # A tibble: 3 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2
#> 2     2     4
#> 3     3     8

# but this doesn't
df %>%
  mutate(!!col_name := if_else((!!col_name == 6 & a == 3), 8, !!col_name))
#> Error: Problem with `mutate()` input `b`.
#> x `false` must be a double vector, not a character vector.
#> i Input `b` is `if_else(("b" == 6 & a == 3), 8, "b")`.
Created on 2020-10-13 by the reprex package (v0.3.0)

【问题讨论】:

    标签: r tidyeval


    【解决方案1】:

    使用基础

    df[ df[, col_name ] == 6 & df$a == 3, col_name ] <- 8
    
    df
    #   a b
    # 1 1 2
    # 2 2 4
    # 3 3 8
    

    注意:是的,我知道问题是关于“整洁”,这只是为了说明为什么对于一些简单的任务,基本解决方案同样好/更好。

    【讨论】:

      【解决方案2】:

      要在 RHS 上使用 !!,您需要先将 col_name 转换为符号。

      library(dplyr)
      df %>% mutate(!!col_name := if_else(!!sym(col_name) == 6 & a == 3, 
                                  8, !!sym(col_name)))
      

      其他替代方法包括使用get

      df %>% mutate(!!col_name := if_else(get(col_name) == 6 & a == 3,
                                   8, get(col_name)))
      

      或者没有任何 NSE 使用 .data

      df %>% mutate(!!col_name := if_else(.data[[col_name]] == 6 & a == 3, 
                                  8, .data[[col_name]]))
      

      【讨论】:

      • 这三种方法中哪一种更可取?
      • Lionel(rlang 的包作者)最近表示,现在使用.data 是首选方法。这也应该在 rlang/tidyverse 网站的某个地方提到。
      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2015-04-13
      • 2020-08-26
      相关资源
      最近更新 更多