我在用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
我不知道是否有人能给我一些选项 或者其他的观点来做。
谢谢
虽然没有@jogo的回答那么简洁,但是。
sapply(split(example, rownames(example)),
function(z){grepl(as.character(z$x), as.character(z$y))})
你可以用 grepl
和 ifelse
以此方式。
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
你可以试试 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