我正在尝试使用dplyr::recode()
和stringr::str_detect()
重新编码字符变量。我意识到可以使用dplyr::case_when()
完成此操作,如此处所述:https://community.rstudio.com/t/recoding-using-str-detect/5141,但我确信必须通过recode()
进行此操作。
考虑这种情况:
library(tidyverse)
rm(list = ls())
data <- tribble(
~id, ~time,
#--|--|
1, "a",
2, "b",
3, "x"
)
我想替换&#34; x&#34;在数据框中使用&#34; c&#34;通过str_detect()
以及我的方式:
data %>%
mutate(time = recode(data$time, str_detect(data$time, "x") = "c"))
但这不起作用:
错误:意外&#39; =&#39;在: &#34;数据%&gt;% mutate(time = recode(data $ time,str_detect(data $ time,&#34; x&#34;)=&#34;
显然R不知道如何处理上一个=
,但我相信它必须存在于重新编码功能中,如下所示:
recode(data$time, "x" = "c")
这正确执行,如下所示:
str_detect(data$time, "x")
但这不是:
recode(data$time, str_detect(data$time, "x") = "c")
有没有办法让这两个功能相互协作?
答案 0 :(得分:4)
如果您希望尽可能简单,我会使用gsub
library(dplyr)
data %>%
mutate(time = gsub("x", "c", time))
这消除了recode
和str_detect
如果您已经开始使用stringr
,那么您应该使用str_replace
而不是str_detect
:
data %>%
mutate(time = str_replace(time, "x", "c"))
如果你想要替换整个值,如果它包含'x',那么只需添加一些正则表达式:
data %>%
mutate(time = str_replace(time, ".*x.*", "c"))
正则表达式的细分:.*
表示匹配至少0次的任何字符(除了\ n)。我们将.*
放在x的前面和后面,这样如果“x”中有任何前导或尾随字符,它们仍会被捕获。