创建从字符串中提取的数字向量

时间:2016-02-09 11:19:42

标签: r

可能标题不理想,欢迎您改变它。

使用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字符串并取左边的数字和右边的数字。

2 个答案:

答案 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")