我正在尝试在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
)。
我在这里做什么错了?
答案 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
为向量的每个值输出TRUE
或FALSE
,因此可以与ifelse
(通常在数据帧内)一起使用。