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

R - match strings between two columns

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

C1  C2
qw  qw, er
er  ty
ty  ty

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

C3
ALSO
NONE
ONLY

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

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

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

我试着用 mapplystri_detect_fixedstringi

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 而不是 mapply

这可能不是最优雅的解决方案,但您可以在行模式下使用 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")

rowwise 在这种情况下对每一行分别进行计算很有用。 假设 df 是原始数据框,下面的列 C1C2 应该可以工作

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