R语言 检查列是否包含来自另一列的值

xfyts7mz  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(372)

在R中有没有一种方法可以检查一列中的值是否包含另一列中的值?
在下面的示例中,我尝试查看col 2中的值是否包含在col 1中的值中(在每行中独立),但收到一条警告消息:参数“pattern”的长度大于1,将只使用第一个元素。
标志栏的第一行/最后一行应显示“是”,第二行和第三行应显示“否”。如有任何关于如何解决的想法,将不胜感激。

col1 <- c("R.S.U.L.C","S.I.W","P.U.E","A.E.N")
col2 <- c("R","U","I","N")

df2 <- data.frame(col1,col2)

df2$Flag <- ifelse(grepl(df2$col2,df2$col1),"Yes","No")
vcirk6k6

vcirk6k61#

df2$flag <- mapply(grepl, df2$col2, df2$col1)
grepl()的模式参数只使用第一个元素:
参见?grepl
如果提供长度为2或更大的字符向量,则使用第一个元素并发出警告。

eulz3vhy

eulz3vhy2#

我们可以使用str_detect,它对模式和字符串都进行了矢量化

library(dplyr)
library(stringr)
df2 <- df2 %>% 
     mutate(Flag = c('No', 'Yes')[1+str_detect(col1, as.character(col2))])
df2
#       col1 col2 Flag
#1 R.S.U.L.C    R  Yes
#2     S.I.W    U   No
#3     P.U.E    I   No
#4     A.E.N    N  Yes
pes8fvy9

pes8fvy93#

这可以通过sapply/grepl的组合来完成。沿着df2$colgrepl循环,并将其放入字符串df$col1中。
这句俏皮话很明显。

i <- sapply(seq_along(df2$col2), function(i) grepl(df2$col2[i], df2$col1[i]))
df2$Flag <- c("No", "Yes")[i + 1L]
df2
#       col1 col2 Flag
#1 R.S.U.L.C    R  Yes
#2     S.I.W    U   No
#3     P.U.E    I   No
#4     A.E.N    N  Yes
3bygqnnd

3bygqnnd4#

str_detect的简洁实现,使用ifelse。请注意,使用fixed()可确保文本内容匹配。否则,str_detect默认为regex,如果模式列包含可解释为正则表达式的字符,则可能导致意外行为。

library(tidyverse)

df2 <- df2 %>% 
 mutate(Flag = ifelse(str_detect(col1, fixed(as.character(col2))), "Yes", "No"))

 df2
 #       col1 col2 Flag
 #1 R.S.U.L.C    R  Yes
 #2     S.I.W    U   No
 #3     P.U.E    I   No
 #4     A.E.N    N  Yes

相关问题