R如何使用dplyr :: mutate和if_else根据条件更改变量的值?

时间:2018-11-24 23:20:44

标签: r if-statement dplyr mutate

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

例如,假设我拥有以下数据集x,并且我想创建一个新变量var3,这样,如果满足条件,var3就取1,否则{ {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 时,我需要var3取其旧值,而不仅仅是一个奇异的值(例如FALSE)。

我在这里做什么错了?

2 个答案:

答案 0 :(得分:2)

使用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))

答案 1 :(得分:1)

您应该使用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(通常在数据帧内)一起使用。