R - 匹配两列之间的字符串

时间:2017-12-14 04:03:24

标签: r string grepl

我有两列,一个标识符(C1)和一个目标(C2)。

C1  C2
qw  qw, er
er  ty
ty  ty

现在,我需要在相应的C2字符串中搜索C1的元素。在这个例子中,结果将是:

C3
ALSO
NONE
ONLY

我在grepl(C1, C2)语句中使用了case_when,但只有C1的第一个元素用于匹配:

C3 <- case_when(C1==C2~"ONLY",
                grepl(C1, C2)~"ALSO",
                TRUE~"NONE")

只有结果是可以的,因为它们不需要字符串匹配,并且NONE结果是仅在ONLY和ALSO之后的剩余部分。请建议最简单的方法。

3 个答案:

答案 0 :(得分:2)

我尝试使用<span onClick="clear()">your text</span>

中的mapplystri_detect_fixed执行此操作
stringi

尽管如此,应该有更好的方法来使用library(dplyr) library(stringi) df$C3 <- case_when(stri_detect_fixed(df$C1, df$C2) ~ "ONLY", mapply(function(x, y) grepl(x, y), df$C1, df$C2) ~ "ALSO", TRUE~"NONE") df$C3 #[1] "ALSO" "NONE" "ONLY" 代替grepl

答案 1 :(得分:1)

这可能不是最优雅的解决方案,但您可以在行模式下使用apply来执行grepl计算。然后将case_when与此结果一起使用:

df$result <- case_when(df$C1 == df$C2 ~ "ONLY",
                       apply(df, 1, function(x) grepl(x[1], x[2])) ~ "ALSO",
                       TRUE ~ "NONE")

答案 2 :(得分:1)

在这种情况下,

rowwise可以分别对每行进行计算。 假设df是原始数据框,其中C1列和C2下面应该有效

library(dplyr)
df <- df %>% rowwise %>% 
mutate(C3 = case_when(C1==C2~"ONLY", grepl(C1, C2)~"ALSO", TRUE~"NONE")) %>%
 ungroup