2017-07-17 78 views
0

我正在處理存儲在文件夾(2488)中的多個csv文件。每個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月,所以我創建的數據幀與從起始日期1860行到2017年六月

創建日期的順序來命名的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 
} 

我的問題是,因爲我存儲的列數與我擁有的gaugin站數量相同(2488個站點),而每個站點在不同的年份月份開始,所以如何爲每個站點存儲每個i時指定哪個列,它必須從哪個行開始?

如果i = 1,並且第一條記錄是在1993-01-01,我希望該列開始於gst行,對應於1993-01-01等與其餘站。

非常感謝。

回答

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

謝謝弗洛裏安·馬斯,而試圖向左-join我最終通過'index'來解決問題:data [rownames(kk.df),colnames(kk.df)[2]] = as.numeric(as.character(kk.df [2] [[1 ]]))這種方式永遠y gaugin電臺存儲在與rownames相匹配的時間。 – Marina

+0

很好,你能解決你的問題,很高興我可以幫助! – Florian