如何在R语言中使用GREPL与类似列式模式的字符串一起使用

问题描述 投票:1回答:1

我在用R工作,我想用R清理我的数据。我有下一个数据。

example<- data.frame(x=c("hungry","fly","day","dog"),
                        y=c("i'm hungry","i believe i can fly","a hard day's night","cat"))

我试图识别Y列是否包含X列中的字符 我试着用grepl(),但那个函数不能用于向量,我试着用... str_detect() 但我不知道为什么不工作。我终于尝试得到下一个表。

      x                   y        Flag
1 hungry          i'm hungry          1
2    fly i believe i can fly          1
3    day  a hard day's night          1
4    dog                 cat          0

我不知道是否有人能给我一些选项 或者其他的观点来做。

谢谢

r grepl
1个回答
1
投票

虽然没有@jogo的回答那么简洁,但是。

sapply(split(example, rownames(example)), 
       function(z){grepl(as.character(z$x), as.character(z$y))})

1
投票

你可以用 greplifelse 以此方式。

example$Flag <- ifelse(grepl(paste0(example$x, collapse = "|"), example$y), 1, 0)

使用 paste0,这就垮了 example$x 变成一个单一的模式,其间以 | 并已 grepl 检查复合模式是否与 example$y:如果发现匹配,则 ifelse 声明分配 1如果没有, 0.

或者,您也可以使用 str_detect从包 stringr: 请注意,将两个变量分配给函数的顺序很重要--你需要将较大的字符串(即那些在 example$y),而且你需要将两个变量都转换为字符。但好的一面是不需要使用 paste0 改造。

example$Flag <- ifelse(str_detect(as.character(example$y), as.character(example$x)), 1, 0)

结果:

example
       x                   y  Flag
1 hungry          i'm hungry     1
2    fly i believe i can fly     1
3    day  a hard day's night     1
4    dog                 cat     0

1
投票

你可以试试 Vectorize 以使 grepl vercorized, e.g,

example <- within(example,Flag <- +Vectorize(grepl)(x,y))

以致于

> example
       x                   y Flag
1 hungry          i'm hungry    1
2    fly i believe i can fly    1
3    day  a hard day's night    1
4    dog                 cat    0
© www.soinside.com 2019 - 2024. All rights reserved.