【问题标题】:dplyr::recode in conjunction with stringr::str_detect()dplyr::recode 与 stringr::str_detect() 结合使用
【发布时间】:2018-09-14 04:03:24
【问题描述】:

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

我想通过str_detect() 将数据框中的“x”替换为“c”,这是我的做法:

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

但这不起作用:

错误:意外的“=”在: “数据%>% 变异(时间=重新编码(数据$时间,str_detect(数据$时间,“x”)=“

显然 R 不知道如何处理最后一个 =,但我相信它必须用于 recode 功能,如下所示:

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

这会正确执行,就像这样:

str_detect(data$time, "x")

但这不是:

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

有没有办法让这两个函数相互配合?

【问题讨论】:

  • str_detect 返回TRUEFALSE,而不是您要查找的字符。使用gsub,或者如果您想使用str_detectcase_whenifelse
  • 这就是问题所在。 recode() 不明白如何处理 TRUE 而不是实际字符,我明白了。

标签: r dplyr tidyverse stringr


【解决方案1】:

如果你想尽可能简单,我会使用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”中有任何前导或尾随字符,它们仍然会被捕获。

【讨论】:

  • 不幸的是,这不是一个选项,因为我需要 str_detect 来定位和替换我实际数据中的某些观察结果。
  • 如果您想使用stringr,请查看我的编辑。 str_detect 只是觉得不适合您的情况。但老实说,你只是用你的评论描述了gsub
  • 我有一种预感,你可能正在做与昨天提出的这个问题相同的课程:stackoverflow.com/q/49632442/6535514
  • like gsub, str_replace 只会替换我告诉它要查找的字符串,并保留最终的尾随字符。这不是我想要的,因此需要str_detect。似乎case_when 确实是为此目的唯一合适的解决方案。 >编辑:有趣的巧合,但我试图用这个将时间变量重新编码为有序因子。为此,我会坚持使用case_when
  • 哦,那么您只需要修改您的模式以包含更具体的正则表达式。照原样,您最初的问题只是说您想将“x”改为“c”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多