首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用R从列中提取文本

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

Stack Overflow用户
提问于 2021-01-26 15:11:36
回答 5查看 582关注 0票数 0

对于特定列中的每一行( 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

摘录的案文应如下:

克洛奇

大/大轰炸/02-苏西_大轰炸

大/大轰炸/02-苏西_大轰炸

AB_AeolinaL

AB_AeolinaL

AB_violadamourL/rel99999

AB_violadamourL/rel99999

AB_violadamourR

AB_violadamourR

有人能推荐使用R的策略吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-01-26 15:27:43

可以使用stringrstr_remove(string,pattern)函数,如下所示:

代码语言:javascript
复制
str = "grand/Grand_bombarde/02-suchy_Grand_bombarde/038-D.wav"
str_remove(str,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")

输出:

代码语言:javascript
复制
> str_remove(str,"/[0-9]+[-]*[A-Z]*[#]*[.][a-z]+")
[1] "grand/Grand_bombarde/02-suchy_Grand_bombarde"

然后,您只需遍历所有其他字符串:

代码语言:javascript
复制
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]+")

输出:

代码语言:javascript
复制
> 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"  
票数 3
EN

Stack Overflow用户

发布于 2021-01-26 15:26:43

必须使用此方法将字符串减为子字符串:

代码语言:javascript
复制
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"

输入

代码语言:javascript
复制
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)给出最后一个"/“的位置。

票数 0
EN

Stack Overflow用户

发布于 2021-01-26 15:37:34

假设您提议的字符串位于dataframe的列中:

代码语言:javascript
复制
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" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65903933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档