r - dplyr::recode 与 stringr::str_detect() 结合使用

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

我想通过 str_detect() 用“c”替换数据框中的“x”这是我的方法:
data %>% 
 mutate(time = recode(data$time, str_detect(data$time, "x") = "c"))

但这不起作用:

Error: unexpected '=' in: "data %>% mutate(time = recode(data$time, str_detect(data$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))

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

关于r - dplyr::recode 与 stringr::str_detect() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653607/

相关文章:

r - 使用列索引而不是列名在 R dplyr 中进行变异

r - 如何对 R 中管道序列中的列选择应用函数?

r - 计算前 n 行的总和

r - 添加自定义函数以在 dplyr 中进行汇总

r - 分组汇总仍然给出每个单独行的结果

r - 如何进一步操作从 R dplyr 中的 group_map() 创建的列表

r - r 中的嵌套 dplyr 循环

r - 如何计算有多少子字符串与列表中的至少一个元素匹配,前提是它们前面或后面没有否定?

r - 创建连续整数,然后使用 dplyr 创建存储在 sqlserver 中的表的索引

r 获取具有最大值的变量名