dplyr :: recode与stringr :: str_detect()一起使用

时间:2018-04-04 14:25:51

标签: r dplyr tidyverse stringr

我正在尝试使用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")

有没有办法让这两个功能相互协作?

1 个答案:

答案 0 :(得分:4)

如果您希望尽可能简单,我会使用gsub

library(dplyr)
data %>% 
  mutate(time = gsub("x", "c", time))

这消除了recodestr_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”中有任何前导或尾随字符,它们仍会被捕获。