首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >case_when &%(%)

case_when &%(%)
EN

Stack Overflow用户
提问于 2022-03-15 14:41:56
回答 2查看 78关注 0票数 3

我试图在%in%中使用case_when(),但是它并不像在R中一般使用的那样工作,下面就是一个例子。有人能指点这个实现有什么问题吗?

代码语言:javascript
复制
df <- structure(list(name = c("abc A", "xyz B", "jkl C"), text = c("my name is abc A", 
"my name is xyz B", "my name is jkl C")), class = "data.frame", row.names = c(NA, 
-3L))

x <- c("ABC","B","C")

df %>% mutate(flag=case_when(name %in% x~TRUE, TRUE~FALSE))

输出

代码语言:javascript
复制
 name             text  flag
abc A my name is abc A FALSE
xyz B my name is xyz B FALSE
jkl C my name is jkl C FALSE

预期输出

代码语言:javascript
复制
 name             text  flag
abc A my name is abc A TRUE
xyz B my name is xyz B TRUE
jkl C my name is jkl C TRUE 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-15 14:53:08

这是预期的输出。在向量"abc A"中找不到字符串c("ABC","B","C")"xyz B""jkl C"也不存在。

你是不是在找字符串匹配?那么您应该使用str_detect而不是%in%

代码语言:javascript
复制
df %>% mutate(flag=case_when(stringr::str_detect(name, x)~TRUE, TRUE~FALSE))
#>    name             text  flag
#> 1 abc A my name is abc A FALSE
#> 2 xyz B my name is xyz B  TRUE
#> 3 jkl C my name is jkl C  TRUE

请注意,如果只有两个选项,即输出的TRUEFALSE,则根本不需要case_when

代码语言:javascript
复制
df %>% mutate(flag = stringr::str_detect(name, x))
#>    name             text  flag
#> 1 abc A my name is abc A FALSE
#> 2 xyz B my name is xyz B  TRUE
#> 3 jkl C my name is jkl C  TRUE

还请注意,案例1应该是FALSE,因为"abc""ABC"不匹配。如果您不关心大小写,可以使用grepl,正如AndS所描述的那样。

票数 4
EN

Stack Overflow用户

发布于 2022-03-15 14:53:23

问题是,需要折叠x才能成为模式。试试这个:

代码语言:javascript
复制
library(tidyverse)

df %>% 
  mutate(flag=grepl(paste(x, collapse = "|"), name, ignore.case = T))
#>    name             text flag
#> 1 abc A my name is abc A TRUE
#> 2 xyz B my name is xyz B TRUE
#> 3 jkl C my name is jkl C TRUE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71484130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档