跳过行直到具有特定值的行

时间:2017-06-12 19:55:34

标签: r dplyr data.table

我需要从URL读取.txt文件,但希望跳过行直到具有特定值的行。网址为https://fred.stlouisfed.org/data/HNOMFAQ027S.txt,数据采用以下格式:

"

...(行数)

...(行数)

...(行数)

日期值

1945-01-01 144855

1946-01-01 138515

1947-01-01 136405

1948-01-01 135486

1949-01-01 142455

"

我想跳过所有行,直到" DATE // VALUE"并开始从此行开始导入数据(包括" DATE // VALUE")。有没有办法用data.table的fread() - 或任何其他方式,例如使用dplyr?

非常感谢您的努力和时间!

最佳,

下进行。

3 个答案:

答案 0 :(得分:2)

以下是使用start(),dplyr和stringr处理字符串从这些文本文件中提取信息的方法。

readr::read_lines

我使用library(tidyverse) library(stringr) df <- data_frame(lines = read_lines("https://fred.stlouisfed.org/data/HNOMFAQ027S.txt")) %>% filter(str_detect(lines, "^\\d{4}-\\d{2}-\\d{2}")) %>% mutate(date = str_extract(lines, "^\\d{4}-\\d{2}-\\d{2}"), value = as.numeric(str_extract(lines, "[\\d-]+$"))) %>% select(-lines) df #> # A tibble: 286 x 2 #> date value #> <chr> <dbl> #> 1 1945-10-01 1245 #> 2 1946-01-01 NA #> 3 1946-04-01 NA #> 4 1946-07-01 NA #> 5 1946-10-01 1298 #> 6 1947-01-01 NA #> 7 1947-04-01 NA #> 8 1947-07-01 NA #> 9 1947-10-01 1413 #> 10 1948-01-01 NA #> # ... with 276 more rows 过滤了您要保留的所有行,然后使用stringr::str_detect和正则表达式从字符串中提取出您想要的信息。

答案 1 :(得分:2)

将fread与unix工具结合使用:

> fread("curl -s https://fred.stlouisfed.org/data/HNOMFAQ027S.txt | sed -n -e '/^DATE.*VALUE/,$p'")
           DATE   VALUE
  1: 1945-10-01    1245
  2: 1946-01-01       .
  3: 1946-04-01       .
  4: 1946-07-01       .
  5: 1946-10-01    1298
 ---                   
282: 2016-01-01 6566888
283: 2016-04-01 6741075
284: 2016-07-01 7022321
285: 2016-10-01 6998898
286: 2017-01-01 7448792
> 

答案 2 :(得分:1)

使用:

file.names <- c('https://fred.stlouisfed.org/data/HNOMFAQ027S.txt',
                'https://fred.stlouisfed.org/data/DGS10.txt',
                'https://fred.stlouisfed.org/data/A191RL1Q225SBEA.txt')

text.list <- lapply(file.names, readLines)
skip.rows <- sapply(text.list, grep, pattern = '^DATE\\s+VALUE') - 1

# option 1
l <- Map(function(x,y) read.table(text = x, skip = y), x = text.list, y = skip.rows)

# option 2
l <- lapply(seq_along(text.list), function(i) fread(file.names[i], skip = skip.rows[i]))

会为您提供data.frame&#39; s(选项1)或data.table&#39; s(选项2)的列表。