【问题标题】:Creating new variable with dplyr::mutate based on multiple conditions and corresponding variable names passed by string vector (or tidyselect)dplyr::mutate 基于多个条件和字符串向量(或 tidyselect)传递的相应变量名称创建新变量
【发布时间】:2020-12-01 13:23:54
【问题描述】:

我很确定之前已经讨论过这个问题,但我很难用语言表达这个问题: 比如我在找这个数据框...

iris %>%
    mutate(has_petal_1.4 = Petal.Length == 1.4 | Petal.Width == 1.4,
           width_greater_1 = Sepal.Width > 1 & Petal.Width > 1)

...无需明确命名条件中的变量。 有没有办法使用字符串向量传递变量名?不幸的是,这似乎不起作用:

varsel <- c('Petal.Length', 'Petal.Width')
iris %>%
  mutate(has_petal_1.4 = 1.4 %in% c(!!! syms(varsel)))

此外,我想知道在 mutate() 函数中是否有使用 tidyselect 的解决方案。到目前为止,我使用了新的方便的 cross() 函数来改变多个变量。是否也可以在条件下使用它?这是另一个不起作用的示例:

iris %>%
  mutate(has_petal_1.4 = across(c(starts_with('Petal')), function(x) {1.4 %in% x}))

非常感谢任何帮助。

【问题讨论】:

    标签: r dplyr multiple-conditions


    【解决方案1】:

    有多种方式,一种选择是c_across

    library(dplyr) # >= 1.0.0
    iris %>% 
        rowwise %>% 
        mutate(has_petal_1.4 = any(c_across(varsel) == 1.4),
               width_greater_1 = all(c_across(ends_with('Width')) > 1)) %>%
        ungroup
    # A tibble: 150 x 7
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width Species has_petal_1.4 width_greater_1
    #          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <lgl>         <lgl>          
    # 1          5.1         3.5          1.4         0.2 setosa  TRUE          FALSE          
    # 2          4.9         3            1.4         0.2 setosa  TRUE          FALSE          
    # 3          4.7         3.2          1.3         0.2 setosa  FALSE         FALSE          
    # 4          4.6         3.1          1.5         0.2 setosa  FALSE         FALSE          
    # 5          5           3.6          1.4         0.2 setosa  TRUE          FALSE          
    # 6          5.4         3.9          1.7         0.4 setosa  FALSE         FALSE          
    # 7          4.6         3.4          1.4         0.3 setosa  TRUE          FALSE          
    # 8          5           3.4          1.5         0.2 setosa  FALSE         FALSE          
    # 9          4.4         2.9          1.4         0.2 setosa  TRUE          FALSE          
    #10          4.9         3.1          1.5         0.1 setosa  FALSE         FALSE          
    # … with 140 more rows
    

    或者rowSums 的更快选项

    iris %>%     
        mutate(has_petal_1.4 =  rowSums(select(., varsel) == 1.4) > 0,
               width_greater_1 = rowSums(select(., ends_with('Width')) > 1) == 2)
    

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 2018-08-13
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      相关资源
      最近更新 更多