根据开始日期存储数据

时间:2017-07-17 08:04:55

标签: r

我正在使用存储在文件夹中的多个csv文件(2488)。每个csv包含来自gaugin站的月度数据,格式为年*月。我想将所有这些csv文件存储在一个大数据框中,其中cols是不同gaugin工作站的ID,行数%Y-%m-%d。

为此,我列出了list.files的所有文件:

a <- list.files(pattern="./*.csv",full.names=TRUE)

创建一个具有最终尺寸的虚拟数据框:

gst <- data.frame(NA,1860,2488) # 1860 times - 2488 stations

每个csv文件都以不同的日期开始。最早的日期是1863年1月,所以我创建了从开始日期到2017年6月的1860行的数据框。

我创建了一系列日期来命名gst的行:

    s <- paste0(1863,"-01-01")
    e <- paste0(2017,"-12-31")
    ss<- chron(s, format='y-m-d')
    ee<- chron(e, format='y-m-d')
    dates <- seq.dates(ss,ee,by='months')

在以下循环中,我读取了每个csv文件。首先,我更改初始数据框格式:年*月+总列。

# Initial format          
            Jan     Feb     Mar    Apr
    1993    NA      0.05    0.05    0.06
    1994    0.18    0.15    0.1     0.19
    1995    0.22    0.23    0.26    0.11
    1996    0.14    0.11    0.1     0.08
    1997    0.12    0.16    0.07    0.05
    1998    0.12    0.07    0.12    0.18
    1999    0.07    0.32    0.14    0.15
    2000    0.13    0.22    0.15    0.1
    2001    0.18    0.09    0.5     0.26

到单列数据框(kk.df),数据存储为:

Date      Value
93-01-01  NA
93-02-01  0.05
93-03-01  0.05
93-04-01  0.06
93-05-01  0.05
93-06-01  0.05
93-07-01  0.03
93-08-01  0.03
93-09-01  0.05
93-10-01  0.09
93-11-01  0.04
93-12-01  0.10

这是我正在使用的循环:

for (i in 1:length(a)){

  kk <- read.csv(a[i])
  colnames(kk) <- c(seq(1,12,1),'total') # 12 (months) columns and a total column

  kk.ts <- ts(as.vector(t(as.matrix(kk))),
              start=as.numeric(c(rownames(kk)[1],1)), end= as.numeric(c(rownames(kk)[dim(kk)[1]],12)),frequency=12)

  kk.df <- as.data.frame(kk.ts)
  colnames(kk.df) <- a[[i]]

    a <- paste0(start,"-01-01")
    b <- paste0(end,"-12-31")
    ac<- chron(a, format='y-m-d')
    bc<- chron(b, format='y-m-d')
    times <- seq.dates(ac,bc, by="months")

    rownames(kk.df) <- times


    gst[i,] <- kk.df
}

我的问题是,由于我存储的列数与我所拥有的相同数量的列(2488个电台)以及每个电台以不同的年月开始,我如何指定何时每个i存储一个站,它必须从哪一行开始?

如果i = 1并且第一条记录是在1993-01-01,我希望该列从与{1}}对应的行开始,对应于1993-01-01,依此类推其他车站。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

也许你可以在for循环中加入一个连接:

df  = data.frame(date = seq(Sys.Date(),Sys.Date()+3,by=1))
station1 = data.frame(date = seq(Sys.Date()+2,Sys.Date()+3,by=1),data = c(1,2))
station2 = data.frame(date = seq(Sys.Date()+1,Sys.Date()+2,by=1),data = c(2,3))

df = df %>% left_join(station1) %>% rename(station1=data)
df = df %>% left_join(station2) %>% rename(station2=data)

输入:

> df
        date
1 2017-07-17
2 2017-07-18
3 2017-07-19
4 2017-07-20
> station1
        date data
1 2017-07-19    1
2 2017-07-20    2
> station2
        date data
1 2017-07-18    2
2 2017-07-19    3

输出:

> df
        date station1 station2
1 2017-07-17       NA       NA
2 2017-07-18       NA        2
3 2017-07-19        1        3
4 2017-07-20        2       NA