请参阅下表。我需要检查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])
它有效......我不知道为什么......
答案 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
行,我会使用tidyverse
和iterators
:
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
。