R-read.csv只读取某些行,而不必每次都修改代码

时间:2016-06-21 21:01:47

标签: r csv subset tail read.csv

我只想使用csv文件中与特定日期对应的行。我已经看到很多很好的方法来做到这一点,但是,它们都要求你实际知道某个日期并在你的代码中指定它。由于我将经常运行此程序,我正在寻找的是一个完全自动化的过程,我不必在代码中继续更改特定日期。我的数据集看起来像这样(幸运的是,我总是想从底部读取,所以如果需要我可以使用tail):

Date      Ticker
...        ....
2015-12-31 TIF
2016-01-31 DD
2016-01-31 ADP

基本上,我在问是否有办法说read.csv("df.csv", *only rows with same date as last row*)

我知道基于日期的子集是可能的,或者可能有某种方法可以这样做:

x <-tail(df, *only rows with same date as last row*)

然而,经过一段时间后,我的数据集会变得非常大,我不认为我每次都想继续阅读这么大的数据集。

1 个答案:

答案 0 :(得分:0)

我将一个自定义函数放在一起,该函数将从指定日期读入data.frame。

ReadFrom <- function(filename, date){
  sno<-grep(date, readLines(filename))[1]
  dat <- read.table(filename, skip=sno-1, header=F, sep=",") 
  names(dat) <- unlist(read.table(filename, nrows=1, stringsAsFactors=F)) # insert header from row 1 of .csv file
  return(dat)
}

ReadFrom("example.csv", "2016-01-31")
        Date Ticker
1 2016-01-31     DD
2 2016-01-31    ADP

ReadFrom("example.csv", "2015-12-31")
        Date Ticker
1 2015-12-31    TIF
2 2016-01-31     DD
3 2016-01-31    ADP

数据(写作“example.csv”):

structure(list(Date......Ticker = structure(c(1L, 3L, 2L), .Label = c("2015-12-31 TIF", 
"2016-01-31 ADP", "2016-01-31 DD"), class = "factor")), .Names = "Date......Ticker", class = "data.frame", row.names = c(NA, 
-3L))

虽然有很多与此解决方案相关的假设:

(i)必须事先知道撰写日期的格式(即YYYY-MM-DD)

(ii)csv的日期必须按升序排列

(iii)不建议在非常大的csv文件上运行(对于非常大的文件,readLines函数可能会变得非常慢)。在这种情况下考虑sql解决方案。