【问题标题】:R how to change the value of a variable based on a condition using dplyr::mutate and if_else?R如何使用dplyr::mutate和if_else根据条件更改变量的值?
【发布时间】:2018-11-24 23:20:44
【问题描述】:

我正在尝试更改 data.frame 中变量的值,如果满足条件,则变量采用另一个值,如果不满足条件,则变量采用其原始值。我很困惑为什么会出现错误,想知道如何修改我的代码来克服这个错误。

例如,假设我有以下数据集x,我想创建一个新变量var3,这样如果满足条件,var3 取 1,如果不满足,var3 取其旧值.

x = data.frame(var1 = c('a', 'b', 'ab'),
               var2 = rep(2,3))
x
x %>%
  dplyr::mutate(var3 = 0,
                var3 = if_else(grep('a', var1)==1, 1, var3))

如果我运行此代码,我会收到以下错误

Error in mutate_impl(.data, dots) : 
  Column `var3` must be length 3 (the number of rows) or one, not 2

正确答案是

  var1 var2 var3
1    a    2    1
2    b    2    0
3   ab    2    1

我的真实代码更复杂,当条件评估 FALSE 时,我需要 var3 取其旧值,而不仅仅是一个奇异值(比如 0)。

我在这里做错了什么?

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    使用 str_detect 回答:

    library(tidyverse)
    
    x = data.frame(var1 = c('a', 'b', 'ab'),
                   var2 = rep(2,3))
    x
    
    x %>%
        dplyr::mutate(var3 = 0,
                      var3 = if_else(str_detect(var1,'a'), 1, var3))
    

    【讨论】:

      【解决方案2】:

      你应该使用grepl:

      x %>%
        mutate(var3 = 0, 
               var3 = if_else(grepl('a', var1), 1, var3))
      

      输出:

        var1 var2 var3
      1    a    2    1
      2    b    2    0
      3   ab    2    1
      

      原因是grep 只为您提供真正匹配的索引,而grepl 为向量的每个值输出TRUEFALSE,因此可以将它与ifelse 一起使用(和一般在数据框内)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-03
        • 2021-08-30
        • 2020-01-05
        • 1970-01-01
        • 2021-08-30
        • 2020-01-02
        • 2022-01-14
        • 2022-12-20
        相关资源
        最近更新 更多