dplyr::与stringr::str_detect()一起重新编码

dplyr::与stringr::str_detect()一起重新编码,r,dplyr,tidyverse,stringr,R,Dplyr,Tidyverse,Stringr,我正在尝试使用dplyr::recode()和stringr::str\u detect()重新编码字符变量。我意识到这可以通过dplyr::case_when()来实现,正如本文所述:,但我确信必须有一种方法通过recode()来实现 考虑这种情况: library(tidyverse) rm(list = ls()) data <- tribble( ~id, ~time, #--|--| 1, "a", 2, "b", 3, "x" ) 但这不起作用: 错误:

我正在尝试使用
dplyr::recode()
stringr::str\u detect()
重新编码字符变量。我意识到这可以通过
dplyr::case_when()
来实现,正如本文所述:,但我确信必须有一种方法通过
recode()
来实现

考虑这种情况:

library(tidyverse)
rm(list = ls())

data <- tribble(
  ~id, ~time,
  #--|--|
  1, "a",
  2, "b",
  3, "x"
)
但这不起作用:

错误:中出现意外的“=”: “数据%>% 突变(时间=重新编码(数据$time,str_detect(数据$time,x))=”

显然,R不知道如何处理最后一个
=
,但我相信它必须在那里用于重新编码功能,如下所示:

recode(data$time, "x" = "c")
这将正确执行,如下所示:

str_detect(data$time, "x")
但这并不是:

recode(data$time, str_detect(data$time, "x") = "c")

有没有一种方法可以让这两个函数相互配合使用?

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

library(dplyr)
data %>% 
  mutate(time = gsub("x", "c", time))
这消除了使用
recode
str\u detect

如果你执意要使用
stringr
,那么你应该使用
str\u replace
,而不是
str\u detect

data %>% 
  mutate(time = str_replace(time, "x", "c"))
如果要替换包含“x”的整个值,则只需添加一些正则表达式:

data %>% 
  mutate(time = str_replace(time, ".*x.*", "c"))

正则表达式的分解:
*
表示任何字符(除\n之外)至少匹配0次。我们将
*
放在x的前面和后面,这样,如果“x”中有任何前导或尾随字符,它们仍然会被捕获。

stru\u detect
返回
,而不是您要查找的字符。使用
gsub
或如果您想使用
str\u detect
case\u当
ifelse
时。这就是问题所在。
recode()
不明白如何处理
TRUE
而不是实际字符,我明白了。不幸的是,这不是一个选项,因为我需要str\u detect来定位并替换实际数据中的某些观察值。如果您想使用
stringr
str\u detect
的话,请查看我的编辑。但是老实说,你刚才在评论中描述了
gsub
,我有一种预感,你可能正在做与昨天提出的这个问题相同的课程:像
gsub
stru replace
只替换我告诉它要查找的字符串,并保留最后的尾随字符。这不是我要找的,因此我们需要
str\u detect
。似乎
case\u当
真的是唯一适合这个目的的解决方案。>编辑:有趣的巧合,但我正试图用它将一个时间变量重新编码为一个有序因子。为此,我将坚持
case\u当
时。哦,那么你只需要修改你的模式以包括更具体的正则表达式。你最初的问题只是说你想把“x”变成“c”
data %>% 
  mutate(time = str_replace(time, ".*x.*", "c"))