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"))