簡體   English   中英

部分字符串與新列中匹配的正則表達式匹配-R

[英]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"])

用戶系統已用完

5.167 0.208 5.348

system.time(for (i in 1: length(patt)) {try.dat[grep(patt[i], try.dat$words), "match"] <- patt[i]})

用戶系統已用完

0.311 0.041 0.377

到目前為止的跡象表明,基本R版本可顯着提高效率。 將在我的實際數據集上進行嘗試(400 <reg ex超過2M行,並查看它是否仍超過軟件包版本。干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM