将由多个分隔符定义的字符串部分拆分为R中的多个变量

时间:2016-09-13 21:52:00

标签: regex r string split

我有一个很大的文件名列表,我需要从使用R中提取信息。信息由多个破折号和下划线分隔。我无法找出一种方法来解决分隔符之间的字符数不一致这一事实(信息的顺序将保持不变,分隔符使用(希望如此))。

例如:

 f <- data.frame(c("EI-SM4-AMW11_20160614_082800.wav", "PA-RF-A50_20160614_082800.wav"), stringsAsFactors = FALSE)
 colnames(f)<-"filename"
 f$area <- str_sub(f$filename, 1, 2)
 f$rec <- str_sub(f$filename, 4, 6)
 f$site <- str_sub(f$filename, 8, 12)

这会为第一个文件生成正确的结果,但第二个文件的结果不正确。

我已经尝试过使用“stringr”和“stringi”软件包,并且知道对值进行硬编码不起作用,所以我使用两个软件包提出了尴尬的解决方案:

f$site <- str_sub(f$filename, 
                  stri_locate_last(f$filename, fixed="-")[,1]+1, 
                  stri_locate_first(f$filename, fixed="_")[,1]-1)

我觉得必须有一个更优雅(和健壮)的方法,也许涉及正则表达式(我很痛苦)。

我查看了其他示例(Extract part of string (till the first semicolon) in RR: Find the last dot in a stringSplit string using regular expressions and store it into data frame)。

非常感谢任何建议/指示。

2 个答案:

答案 0 :(得分:1)

从`tidyr'包中试试这个:

library(tidyr)

f %>% separate(filename, c('area', 'rec', 'site'), sep = '-')

您还可以分割多个差异分度,如下所示:

f %>% separate(filename, c('area', 'rec', 'site', 'date', 'don_know_what_this_is', 'file_extension'), sep = '-|_|\\.')

然后使用dplyr的{​​{1}}函数仅保留所需的列:

select

答案 1 :(得分:0)

这样的事情:

library(stringr)
library(dplyr)

f$area <- word(f$filename, 1, sep = "-")
f$rec <- word(f$filename, 2, sep = "-")
f$site <- word(f$filename, 3, sep = "-") %>%
        word(1,sep = "_")        

dplyr不是必需的,但可以使连接更清晰。 函数word属于stringr