【问题标题】:R - match strings between two columnsR - 两列之间的匹配字符串
【发布时间】:2017-12-14 04:03:23
【问题描述】:

我有两列,一个标识符 (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 之后的剩余结果。请提出最简单的方法。

【问题讨论】:

    标签: r string grepl


    【解决方案1】:

    我尝试使用来自stringi 的mapply 和stri_detect_fixed 进行此操作

    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。

    【讨论】:

    • 幸好我的数据集很小,否则这段代码太麻烦了。无论如何,感谢您的解决方案。
    【解决方案2】:

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

    【讨论】:

    • 我需要检查哪个更快,完成后会在此处更新。
    • apply 和 mapply 函数的执行时间几乎相同,但 mapply 函数与位置无关。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多