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

How to extract text from a column using R

对于特定列中的每一行(Excel 文件中大约有 56,000 条记录),我将如何提取字符串的一部分?我需要将所有文本保留在最后一个“/”正斜杠的左侧。挑战在于并非所有单元格都具有相同数量的“/”。最后一个'/'的末尾总是有一个文件名(*.wav),但文件名中的字符数并不总是相同的(有时是5个,有时是6个)。

下面是单元格中字符串的一些示例:
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

提取的文本应该是:
克洛赫
grand/Grand_bombarde/02-suchy_Grand_bombarde
grand/Grand_bombarde/02-suchy_Grand_bombarde
AB_AeolinaL
AB_AeolinaL
AB_violadamourL/rel99999
AB_violadamourL/rel99999
AB_violadamourR
AB_violadamourR

谁能推荐一个使用 R 的策略?

您必须使用此方法减去字符串:

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) 给你最后一个“/”的位置

您可以像这样使用 stringrstr_remove(string,pattern) 函数:

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

输出:

> 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]+")

输出:

> 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"  

假设您建议的字符串在数据框的一列中:

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)

如果没有/,这个returns.,如果你愿意,可以在之后删除,例如:

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

您可以使用 / 开始匹配,后跟任何字符 1 次或多次,除了正斜杠或使用否定字符的空白字符 class [^\s/]+

然后使用$

匹配字符串末尾的.wav

例如使用 sub 将匹配项替换为空字符串。

[^\s/]+\.wav$

See the regex matches | R demo

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)

输出

[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"