可能标题不理想,欢迎您改变它。
使用list.files
函数我存储了文件名的字符。现在我想使用可以在文件名中找到的数字创建两个数字向量。
> filenames
[1] "Fr. 10to14 - data.csv" "Fr. 13to17 - data.csv" "Fr. 16to20 - data.csv" "Fr. 19to24 - data.csv"
[5] "Fr. 1to5 - data.csv" "Fr. 4to8 -data.csv" "Fr. 7to11 - data.csv"
所以现在我手动完成:
vec_fr_start <- c(10,13,16,19,1,4,7)
vec_fr_end <- c(14,17,20,24,5,8,11)
所以我在向量中存储所有“开始”数字和所有“结束”数字。你知道从这些字符串中捕获这些数字的有效方法吗?
问题是文件可以命名为不同,但锚(numberTOnumber)将始终相同。在这种情况下,最好使用to
字符串并取左边的数字和右边的数字。
答案 0 :(得分:4)
使用基数R:
> sub("\\D*(\\d+)to.*", "\\1", x) # start values
#[1] "10" "13" "16" "19"
> sub(".*to(\\d+).*", "\\1", x) # end values
#[1] "14" "17" "20" "24"
示例输入:
x <- c("Fr. 10to14 - data.csv", "Fr. 13to17 - data.csv", "Fr. 16to20 - data.csv", "Fr. 19to24 - data.csv")
这种方法依赖于提取问题中指定的字符串to
之前和之后的数字:
问题是文件可以命名为不同的锚点 (numberTOnumber)将始终相同。在那种情况下将是 最好使用字符串并取左边的数字和一个上的数字 右。
即使字符串中存在其他数字,它也能正常工作。
答案 1 :(得分:3)
我们可以使用str_extract_all
library(stringr)
lst <- lapply(str_extract_all(filenames, '\\d+'), as.numeric)
do.call(rbind, lst)
# [,1] [,2]
#[1,] 10 14
#[2,] 13 17
#[3,] 16 20
#[4,] 19 24
第一栏将是&#39; start&#39;和第二个结束&#39;
如果我们希望它更具体,即即使字符串中有更多数字,它也只会提取&#39;之前和之后的那些数字。为此,我们可以使用正则表达式的外观。
lst <- lapply(str_extract_all(filenames,
'\\d+(?=to)|(?<=to)\\d+'), as.numeric)
然后像以前一样处理。
或者base R
选项是使用sub
,将数字字符串捕获为一个组,在replacement
中创建一个分隔符,然后使用read.csv/read.table
read.csv(text=sub('\\D+(\\d+)to(\\d+).*',
'\\1,\\2', filenames), header=FALSE)
# V1 V2
#1 10 14
#2 13 17
#3 16 20
#4 19 24
filenames <- c("Fr. 10to14 - data.csv", "Fr. 13to17 - data.csv",
"Fr. 16to20 - data.csv", "Fr. 19to24 - data.csv")