我试图在%in%中使用case_when(),但是它并不像在R中一般使用的那样工作,下面就是一个例子。有人能指点这个实现有什么问题吗?
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))输出
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预期输出
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 发布于 2022-03-15 14:53:08
这是预期的输出。在向量"abc A"中找不到字符串c("ABC","B","C"),"xyz B"或"jkl C"也不存在。
你是不是在找字符串匹配?那么您应该使用str_detect而不是%in%
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请注意,如果只有两个选项,即输出的TRUE或FALSE,则根本不需要case_when。
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所描述的那样。
发布于 2022-03-15 14:53:23
问题是,需要折叠x才能成为模式。试试这个:
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 TRUEhttps://stackoverflow.com/questions/71484130
复制相似问题