Skipping rows until row with a certain value

主宰稳场 提交于 2020-06-26 11:32:22

问题


I need to to read a .txt file from an URL, but would like to skip the rows until a row with a certain value. The URL is https://fred.stlouisfed.org/data/HNOMFAQ027S.txt and the data takes the following form:

"

... (number of rows)

... (number of rows)

... (number of rows)

DATE VALUE

1945-01-01 144855

1946-01-01 138515

1947-01-01 136405

1948-01-01 135486

1949-01-01 142455

"

I would like to skip all rows until the row with "DATE // VALUE" and start importing the data from this line onwards (including "DATE // VALUE"). Is there a way to do this with data.table's fread() - or any other way, such as with dplyr?

Thank you very much in advance for your effort and your time!

Best,

c.


回答1:


Here's a way to get to extract that info from those text files using readr::read_lines, dplyr, and string handling from stringr.

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

I filtered for all the lines you want to keep using stringr::str_detect, then extracted out the info you want from the string using stringr::str_extract and regexes.




回答2:


Combining fread with unix tools:

> 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
> 



回答3:


Using:

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]))

will get you a list of data.frame's (option 1) or data.table's (option 2).



来源:https://stackoverflow.com/questions/44507703/skipping-rows-until-row-with-a-certain-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!