R如何将矢量与另一个n长度矢量部分匹配

时间:2017-07-05 15:02:31

标签: r grep combinations

请参阅下表。我需要检查Family是否包含Appln_ID列中的任何字符串。

我打算用

df$Match[grepl(paste(df$Appln_ID,collapse = "|"),df$Family)]<-"1"

但它不起作用并报告“无效正则表达式CN02822097.8 | CN200810105442.7 | CN200680019886.8 | C”

...

如果我生成

set<-c(Appln_ID[1], Appln_ID[2]....Appln_ID[3000])

它有效......我不知道为什么......

enter image description here

1 个答案:

答案 0 :(得分:0)

已获得OPITED澄清

我制作了相同格式的假数据框:

set.seed(1)
df <- data.frame( Appln_ID = letters[1:5],
              Family = sapply(1:5, function(x) paste0(letters[round(runif(runif(1)*10)*26)],collapse=";")))

这是它的样子:

  Appln_ID            Family
1        a               j;o
2        b e;w;y;q;p;b;e;e;r
3        c             t;m;s
4        d   j;t;x;f;q;c;g;j
5        e             w;i;m

要搜索Family的所有元素中可以找到哪些Appln_ID行,我会使用tidyverseiterators

install.packages("tidyverse")
install.packages("iterators")
library(tidyverse)
library(iterators)

search.all <- df %>%
                mutate(dummy = Family) %>%
                nest(dummy) %>%
                rowwise() %>%
                mutate(data = map(data, ~ unlist(strsplit(as.character(Family),";")))) %>%
                ungroup() %>%
                mutate(data = map(data, ~ (sum(sapply(iter(.x), function(y) y %in% Appln_ID) > 0)))) %>%
                unnest() %>%
                filter(data == 1) %>%
                select(-data)

我们的想法是将 1)复制Family作为单独的列(dummy), 2) strsplit {{ 1}}并保存为嵌套列表, 3)确定dummy中的任何元素是否在dummy中并保存为逻辑, 4)过滤条件为Appln_ID的行。

输出:

TRUE

您忘记了 Appln_ID Family 1 a m;e;v;q;u 2 d u;a;l;s;r 3 e v;k;f;b 还包含e