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 之后的剩余部分。请建议最简单的方法。
我试着用 mapply
和 stri_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
而不是 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
是原始数据框,下面的列 C1
和 C2
应该可以工作
library(dplyr)
df <- df %>% rowwise %>%
mutate(C3 = case_when(C1==C2~"ONLY", grepl(C1, C2)~"ALSO", TRUE~"NONE")) %>%
ungroup
我有两列,一列标识符 (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 之后的剩余部分。请建议最简单的方法。
我试着用 mapply
和 stri_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
而不是 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
是原始数据框,下面的列 C1
和 C2
应该可以工作
library(dplyr)
df <- df %>% rowwise %>%
mutate(C3 = case_when(C1==C2~"ONLY", grepl(C1, C2)~"ALSO", TRUE~"NONE")) %>%
ungroup