我有一个很大的文件名列表,我需要从使用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 R,R: Find the last dot in a string,Split string using regular expressions and store it into data frame)。
非常感谢任何建议/指示。
答案 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
。