我有两列,一个标识符(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之后的剩余部分。请建议最简单的方法。
答案 0 :(得分:2)
我尝试使用<span onClick="clear()">your text</span>
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
。
答案 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