r - grepl,在数据框中搜索模式列表并记下找到每个模式的行
r - grepl, search a data frame for a list of patterns and note the row(s) each pattern was found
我希望这是一个简单的修复方法,只是我没有看到...我有一个函数可以在数据框中搜索模式列表,然后将输出保存为 TSV:
dfSubset <- df[apply(df, 1, function(i) any(grepl(paste(my.list, collapse="|"), i))),]
write_tsv(dfSubset, "dfSubset.txt", col_names=TRUE)
我需要为此添加一个函数,它将在最终数据框 dfSubset 中创建另一列,并将 my.list 中的搜索词粘贴到找到每个搜索词的行旁边。
这是我在 eipi10 对另一个 post 的回答中使用的一些假数据:
my.list <- c("035", "566", "60883", "6110", "6752", "6751", "680","681","682","683","684","684",
"685","686", "7048", "70583","7070", "7078", "7079", "7071", "7280", "72886",
"7714", "7715", "7854", "9583", "99662", "99762", "9985")
# Fake data
set.seed(10)
df = as.data.frame(replicate(5, sample(c(my.list, 1e5:(1e5+1000)),10)), stringsAsFactors=FALSE)
这是所需输出的示例,请注意 pattern_found 列:
V1 V2 V3 V4 V5 Pattern_found
3 100409 100087 100767 100145 7048 7048
4 100682 100583 100336 100895 100719 682
7 100252 100024 100829 100813 7078 7078
感谢您的帮助和建议。
试试这个:
library(stringr)
rgx = paste(my.list, collapse='|')
dfSubset$Pattern_found = apply(dfSubset, 1, function(i) str_extract(paste(i, collapse=','), rgx))
> dfSubset
# V1 V2 V3 V4 V5 Pattern_found
# 3 100409 100087 100767 100145 7048 7048
# 4 100682 100583 100336 100895 100719 682
# 7 100252 100024 100829 100813 7078 7078
在您的 dfSubset
、
上添加基础 R 的想法
ind <- unlist(sapply(my.list, function(i) grep(i, do.call(paste, dfSubset))))
data.frame(dfSubset[as.integer(ind),], Pattern_found = names(ind))
# V1 V2 V3 V4 V5 Pattern_found
#4 100682 100583 100336 100895 100719 682
#3 100409 100087 100767 100145 7048 7048
#7 100252 100024 100829 100813 7078 7078
或以矢量化方式从头开始使用stringi
,
library(stringi)
df$new <- stri_extract_all_regex(do.call(paste, df), paste(my.list, collapse = '|'), simplify = TRUE)[,1]
df[!is.na(df$new),]
# V1 V2 V3 V4 V5 new
#3 100409 100087 100767 100145 7048 7048
#4 100682 100583 100336 100895 100719 682
#7 100252 100024 100829 100813 7078 7078
我希望这是一个简单的修复方法,只是我没有看到...我有一个函数可以在数据框中搜索模式列表,然后将输出保存为 TSV:
dfSubset <- df[apply(df, 1, function(i) any(grepl(paste(my.list, collapse="|"), i))),]
write_tsv(dfSubset, "dfSubset.txt", col_names=TRUE)
我需要为此添加一个函数,它将在最终数据框 dfSubset 中创建另一列,并将 my.list 中的搜索词粘贴到找到每个搜索词的行旁边。
这是我在 eipi10 对另一个 post 的回答中使用的一些假数据:
my.list <- c("035", "566", "60883", "6110", "6752", "6751", "680","681","682","683","684","684",
"685","686", "7048", "70583","7070", "7078", "7079", "7071", "7280", "72886",
"7714", "7715", "7854", "9583", "99662", "99762", "9985")
# Fake data
set.seed(10)
df = as.data.frame(replicate(5, sample(c(my.list, 1e5:(1e5+1000)),10)), stringsAsFactors=FALSE)
这是所需输出的示例,请注意 pattern_found 列:
V1 V2 V3 V4 V5 Pattern_found
3 100409 100087 100767 100145 7048 7048
4 100682 100583 100336 100895 100719 682
7 100252 100024 100829 100813 7078 7078
感谢您的帮助和建议。
试试这个:
library(stringr)
rgx = paste(my.list, collapse='|')
dfSubset$Pattern_found = apply(dfSubset, 1, function(i) str_extract(paste(i, collapse=','), rgx))
> dfSubset
# V1 V2 V3 V4 V5 Pattern_found
# 3 100409 100087 100767 100145 7048 7048
# 4 100682 100583 100336 100895 100719 682
# 7 100252 100024 100829 100813 7078 7078
在您的 dfSubset
、
ind <- unlist(sapply(my.list, function(i) grep(i, do.call(paste, dfSubset))))
data.frame(dfSubset[as.integer(ind),], Pattern_found = names(ind))
# V1 V2 V3 V4 V5 Pattern_found
#4 100682 100583 100336 100895 100719 682
#3 100409 100087 100767 100145 7048 7048
#7 100252 100024 100829 100813 7078 7078
或以矢量化方式从头开始使用stringi
,
library(stringi)
df$new <- stri_extract_all_regex(do.call(paste, df), paste(my.list, collapse = '|'), simplify = TRUE)[,1]
df[!is.na(df$new),]
# V1 V2 V3 V4 V5 new
#3 100409 100087 100767 100145 7048 7048
#4 100682 100583 100336 100895 100719 682
#7 100252 100024 100829 100813 7078 7078