if_else 或替代的向量输出

En_*_*JK7 2 r dplyr

我正在努力寻找以下问题的答案。

\n

我想通过向量搜索 data.frame 中的列。找到匹配项后,我希望利用“搜索向量”的元素来创建新列的新元素。请参阅下面的可重现示例。

\n
colour <- c('red', 'yellow')\n\na <- c('violet', 'red', 'taupe', 'blue', 'yellow_a', 'yellow_b', 'blue_a', 'red_c')\nb <- c('non', 'prim', 'non', 'prim', 'prim', 'prim', 'prim', 'prim')\nc <- c(1, 2, 3, 4, 5, 6, 7, 8)\n\ndf <- data.frame(a, b, c)\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过以下方法:

\n
df_clean <- df %>% mutate(d = if_else(str_detect(a, colour), colour, NA_character_))\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n

问题:查看帮助文件,我无法从“if_else”输出大于 1 的值,我收到以下信息:

\n
\n

错误:mutate()列有问题d。\xe2\x84\xb9 d = if_else(rep(str_detect(a, colour), length(colour)), colour, NA_character_)。x 的true长度必须为 16( 的长度condition)或\n,而不是 2。

\n
\n

我希望实现:

\n
a <- c('violet', 'red', 'taupe', 'blue', 'yellow_a', 'yellow_b', 'blue_a', 'red_c')\nb <- c('non', 'prim', 'non', 'prim', 'prim', 'prim', 'prim', 'prim')\nc <- c(1, 2, 3, 4, 5, 6, 7, 8)\nd <- c(NA_character_, 'red', NA_character_, NA_character_, 'yellow', 'yellow', NA_character_, 'red')\n\ndf_clean <- data.frame(a, b, c, d)\n
Run Code Online (Sandbox Code Playgroud)\n

要求:

\n

如果您能帮助我解决此问题或找到替代解决方案,我将不胜感激,我无法弥补这一差距。我错过了一些可能显而易见的东西?

\n

任何帮助将不胜感激!

\n

非常感谢

\n

geo*_*off 5

str_extract包装中的潜在解决方案stringr

colour <- c('red', 'yellow')

a <- c('violet', 'red', 'taupe', 'blue', 'yellow_a', 'yellow_b', 'blue_a', 'red_c')
b <- c('non', 'prim', 'non', 'prim', 'prim', 'prim', 'prim', 'prim')
c <- c(1, 2, 3, 4, 5, 6, 7, 8)

df <- data.frame(a, b, c)


colour_str <- paste(colour, collapse='|')

df |> 
  mutate(d = str_extract(a, colour_str))

Run Code Online (Sandbox Code Playgroud)

输出:

         a    b c      d
1   violet  non 1   <NA>
2      red prim 2    red
3    taupe  non 3   <NA>
4     blue prim 4   <NA>
5 yellow_a prim 5 yellow
6 yellow_b prim 6 yellow
7   blue_a prim 7   <NA>
8    red_c prim 8    red
Run Code Online (Sandbox Code Playgroud)