簡體   English   中英

如何使用 R 從列中提取文本

[英]How to extract text from a column using R

對於特定列中的每一行(Excel 文件中有約 56,000 條記錄),我將如何提取 go,僅是字符串的一部分? 我需要將所有文本保留在最后一個“/”正斜杠的左側。 挑戰在於並非所有單元格都具有相同數量的“/”。 最后一個 '/' 的末尾總是有一個文件名 (*.wav),但文件名中的字符數並不總是相同的(有時為 5,有時為 6)。

以下是單元格中字符串的一些示例:
克洛赫/51.wav
盛大/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav
盛大/Grand_bombarde/02-suchy_Grand_bombarde/039-D#.wav
AB_AeolinaL/025-C#.wav
AB_AeolinaL/026-D.wav
AB_violadamourL/rel99999/091-G.wav
AB_violadamourL/rel99999/092-G#.wav
AB_violadamourR/024-C.wav
AB_violadamourR/025-C#.wav

提取的文本應為:
鍾形
盛大/Grand_bombarde/02-suchy_Grand_bombarde
盛大/Grand_bombarde/02-suchy_Grand_bombarde
AB_AeolinaL
AB_AeolinaL
AB_violadamourL/rel99999
AB_violadamourL/rel99999
AB_violadamourR
AB_violadamourR

任何人都可以推薦使用 R 的策略嗎?

您可以使用字符串stringr str_remove(string,pattern) function 像:

str = "grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav"
str_remove(str,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")

Output:

> str_remove(str,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")
[1] "grand/Grand_bombarde/02-suchy_Grand_bombarde"

然后你可以遍歷所有其他字符串:

strings <- c("cloch/51.wav",
             "grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav",
             "grand/Grand_bombarde/02-suchy_Grand_bombarde/039-D#.wav",
             "AB_AeolinaL/025-C#.wav",
             "AB_AeolinaL/026-D.wav",
             "AB_violadamourL/rel99999/091-G.wav",
             "AB_violadamourL/rel99999/092-G#.wav",
             "AB_violadamourR/024-C.wav",
             "AB_violadamourR/025-C#.wav")
str_remove(strings,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")

Output:

> str_remove(strings,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")
[1] "cloch"                                       
[2] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[3] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[4] "AB_AeolinaL"                                 
[5] "AB_AeolinaL"                                 
[6] "AB_violadamourL/rel99999"                    
[7] "AB_violadamourL/rel99999"                    
[8] "AB_violadamourR"                             
[9] "AB_violadamourR"  

您必須使用此方法減去字符串:

substr(strings,1,regexpr("\\/[^\\/]*$", strings)-1)
[1] "cloch"                                       
[2] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[3] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[4] "AB_AeolinaL"                                 
[5] "AB_AeolinaL"                                 
[6] "AB_violadamourL/rel99999"                    
[7] "AB_violadamourL/rel99999"                    
[8] "AB_violadamourR"                             
[9] "AB_violadamourR"

輸入

strings<-c("cloch/51.wav","grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav","grand/Grand_bombarde/02-suchy_Grand_bombarde/039-D#.wav","AB_AeolinaL/025-C#.wav","AB_AeolinaL/026-D.wav","AB_violadamourL/rel99999/091-G.wav","AB_violadamourL/rel99999/092-G#.wav","AB_violadamourR/024-C.wav","AB_violadamourR/025-C#.wav")

其中這個正則表達式regexpr("\\/[^\\/]*$", strings)給你最后一個“/”的 position

假設您建議的字符串位於 dataframe 的列中:

df <- data.frame(x = 1:5, y = c("cloch/51.wav", 
                                "grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav", 
                                "grand/Grand_bombarde/02-suchy_Grand_bombarde/039-D#.wav", 
                                "AB_AeolinaL/025-C#.wav", 
                                "AB_AeolinaL/026-D.wav"))

# I define a function that separates a string at each "/" 
# throws the last piece and reattaches the pieces

cut_str <- function(s) {
  st <- head((unlist(strsplit(s, "\\/"))), -1)
  r <- paste(st, collapse = "/")
  return(r)
}

# through the sapply function I get the desired result

new_strings <- as.vector(sapply(df$y, FUN = cut_str))
new_strings

[1] "cloch"                                       
[2] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[3] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[4] "AB_AeolinaL"                                 
[5] "AB_AeolinaL" 

你可以使用

dirname(strings)

如果沒有/ ,則返回. ,如果您願意,您可以在之后將其刪除,例如:

res <- dirname(strings)
res[res=="."] <- ""
``

您可以使用否定字符 class [^\\s/]+使用除正斜杠/空格字符以外的任何字符開始匹配 1 次或多次

然后使用$匹配字符串末尾的.wav

例如,使用 sub 將匹配替換為空字符串。

[^\\s/]+\\.wav$

查看正則表達式匹配| R 演示

strings <- c("cloch/51.wav",
             "grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav",
             "grand/Grand_bombarde/02-suchy_Grand_bombarde/039-D#.wav",
             "AB_AeolinaL/025-C#.wav",
             "AB_AeolinaL/026-D.wav",
             "AB_violadamourL/rel99999/091-G.wav",
             "AB_violadamourL/rel99999/092-G#.wav",
             "AB_violadamourR/024-C.wav",
             "AB_violadamourR/025-C#.wav")

sub("/[^\\s/]+\\.wav$", "", strings)

Output

[1] "cloch"                                       
[2] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[3] "grand/Grand_bombarde/02-suchy_Grand_bombarde"
[4] "AB_AeolinaL"                                 
[5] "AB_AeolinaL"                                 
[6] "AB_violadamourL/rel99999"                    
[7] "AB_violadamourL/rel99999"                    
[8] "AB_violadamourR"                             
[9] "AB_violadamourR"

暫無
暫無

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

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