[英]Partial String Match with matching regular expression in new column - R
我試圖部分匹配帶有正則表達式字符串的數據集中的列的內容。 然后,我希望匹配的行在新列中返回特定的匹配正則表達式。 我的實際數據集很大(有130萬行),包含300個正則表達式,因此找到一種自動執行此操作的方法很重要,因此添加新的正則表達式將不需要代碼修改。
展示:
try.dat<-data.frame(c(1:10),c("hello","goodbye","tidings","partly","totally"))
names(try.dat)[1]<-"num"
names(try.dat)[2]<-"words"
try.dat
在這種情況下,如果一個正則表達式為“ ly”,我希望在匹配行中有一個列為“ ly”的列(部分,全部),而在其他行中有一些“不匹配”的術語。 我已經成功地使用grepl( 不是基於完全匹配的子集)成功地對數據進行了子集化 ,但效果很好,但這是我真正要努力的下一步!
我在嘗試此方法方面取得了一些進展,主要是基於以下代碼建議( 與R匹配的部分字符串 ):
pattern<-c("ll|ood")
matching<-c("ood","ll")
regexes<-data.frame(pattern,matching)
output_vector<-character(nrow(try.dat))
for(i in seq_along(regexes)){
output_vector[grepl(x=try.dat$words,pattern=regexes[[i]][1])] <- regexes [[i]][2]
}
try.dat$match<- output_vector
try.dat
如您所見,這將在匹配的行旁邊返回“ 1”-到達那里,但我的想法已經用完了! 我想知道是否有人可以提供任何指示?
謝謝!
我想這樣會嗎?
library(stringr)
try.dat$match = str_extract(try.dat$words, "ll|ood")
try.dat
# num words match
# 1 1 hello ll
# 2 2 goodbye ood
# 3 3 tidings <NA>
# 4 4 partly <NA>
# 5 5 totally ll
# 6 6 hello ll
# 7 7 goodbye ood
# 8 8 tidings <NA>
# 9 9 partly <NA>
# 10 10 totally ll
默認行為是提取第一個匹配項。 如果要獲取所有匹配項,則可以使用str_extract_all
,但是在這種情況下,您需要一個非data.frame設置來處理不同數量的匹配項。
基本R選項。 只是因為。
patt <- c("ll", "ood")
for (i in 1: length(patt)) {
try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]
}
try.dat
# num words match
#1 1 hello ll
#2 2 goodbye ood
#3 3 tidings <NA>
#4 4 partly <NA>
#5 5 totally ll
#6 6 hello ll
#7 7 goodbye ood
#8 8 tidings <NA>
#9 9 partly <NA>
#10 10 totally ll
基於擴展到1000萬行的數據集,兩者的運行時比較(Macbook Pro OS X):
try.dat<-data.frame(c(1:10000000),c("hello","goodbye","tidings","partly","totally"))
system.time(try.dat[str_extract(try.dat$words,"ll|ood"),"match"])
system.time(for (i in 1: length(patt)) {try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]})
到目前為止的跡象表明,基本R版本可顯着提高效率。 將在我的實際數據集上進行嘗試(400 <reg ex超過2M行,並查看它是否仍超過軟件包版本。干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.