2013-06-28 23 views
2

我有10個小站,每小時降雨量數據爲15年。所有的都有幾個小時,甚至幾天隨機跳入他們的系列。我希望將15年持續時間內的所有小時間步長用作指數,然後將所有臺站數據合併到一個數據幀中,同時給每個臺站的跳數賦予NA(甚至某些鄰居的平均值)。所以任何建議要做到這一點在R如何合併大型小時降雨量數據

比如我有數據幀rainfall_1

date      station210 
1994-01-01 00:00:00 0 
1994-01-01 02:00:00 0 
1994-01-01 03:00:00 0 
1994-01-01 04:00:00 0.6 
1994-01-01 06:00:00 2.6 
1994-01-01 07:00:00 3.2 

和第二站是rainfall_2

date      station212 
1994-01-01 00:00:00 0 
1994-01-01 01:00:00 1.8 
1994-01-01 02:00:00 1.8 
1994-01-01 03:00:00 1.8 
1994-01-01 04:00:00 1.4 
1994-01-01 06:00:00 1.8 

當我嘗試

merge(rainfall_1, rainfall_2, all=TRUE) 
date    station_210 station_212 
1994-01-01 00:00:00 0.0 0.0 
1994-01-01 02:00:00 0.0 1.8 
1994-01-01 03:00:00 0.0 1.8 
1994-01-01 04:00:00 0.6 1.4 
1994-01-01 06:00:00 2.6 1.8 

的一些問題是它錯過第二個數據幀的第二行(rainfall_2),並且它在第5個小時即錯過了數值不存在於兩個數據框中。我正在尋找第二步(2小時)被包括在內的解決方案,並且是NA或其鄰居的平均值,以及第5小時的時間步長,以給出兩者的NA或鄰居的平均值。

想象一下,如果你有這些時間序列數據對於許多站有數千個,有些站隨機失蹤。

+2

請幫助我們爲您提供可重現的示例(即代碼和示例數據),請參閱http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible細節的例子。 –

+0

爲了強調需求,R的時間處理函數是......讓我們說,不同。真的,真的需要看數據。經驗表明,SO的新用戶在禮貌請求後很少提供這樣的數據,因此我們投票結束。但是,請證明我是不正確的,並編輯你的問題以防止關閉。 –

+0

如果您還顯示'dput(rainfall_1)'和'dput(rainfall_2)'的輸出,那麼響應者將更容易。 –

回答

0

我認爲這可能會做你想做的。我不確定爲什麼最終合併的數據集從12月31日下午3:00開始,而不是1月1日午夜。我懷疑這與我的電腦時鐘相對於GMT有關。

df.1 <- read.table(text = ' 
date  time  station210 
1994-01-01 00:00:00 0 
1994-01-01 02:00:00 0 
1994-01-01 03:00:00 0 
1994-01-01 04:00:00 0.6 
1994-01-01 06:00:00 2.6 
1994-01-01 07:00:00 3.2 
', header = TRUE, stringsAsFactors=FALSE) 

df.2 <- read.table(text = ' 
date  time station212 
1994-01-01 00:00:00 0 
1994-01-01 01:00:00 1.8 
1994-01-01 02:00:00 1.8 
1994-01-01 03:00:00 1.8 
1994-01-01 04:00:00 1.4 
1994-01-01 06:00:00 1.8 
', header=TRUE, stringsAsFactors=FALSE) 

cols <- c('date' , 'time') 

df.1$datetime <- apply(df.1[ , cols ] , 1 , paste , collapse = " ") 
df.2$datetime <- apply(df.2[ , cols ] , 1 , paste , collapse = " ") 

df.1 <- df.1[, c('datetime', 'station210')] 
df.2 <- df.2[, c('datetime', 'station212')] 

df.3 <- merge(df.1, df.2, by="datetime", all=TRUE) 

df.3[order(df.3$datetime),] 

df.3$datetime <- format(as.POSIXct(df.3$datetime, format = "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S") 
df.3 

hour <- seq(0,60*60*24,by=60*60) 

datetime <- as.POSIXlt(hour, origin="1994-01-01") 

datetime <- format(as.POSIXct(hour, origin="1994-01-01"), "%Y-%m-%d %H:%M:%S" ) 

newdf <- merge(data.frame(datetime), df.3, all.x=TRUE, by="datetime") 
newdf 

       datetime station210 station212 
1 1993-12-31 15:00:00   NA   NA 
2 1993-12-31 16:00:00   NA   NA 
3 1993-12-31 17:00:00   NA   NA 
4 1993-12-31 18:00:00   NA   NA 
5 1993-12-31 19:00:00   NA   NA 
6 1993-12-31 20:00:00   NA   NA 
7 1993-12-31 21:00:00   NA   NA 
8 1993-12-31 22:00:00   NA   NA 
9 1993-12-31 23:00:00   NA   NA 
10 1994-01-01 00:00:00  0.0  0.0 
11 1994-01-01 01:00:00   NA  1.8 
12 1994-01-01 02:00:00  0.0  1.8 
13 1994-01-01 03:00:00  0.0  1.8 
14 1994-01-01 04:00:00  0.6  1.4 
15 1994-01-01 05:00:00   NA   NA 
16 1994-01-01 06:00:00  2.6  1.8 
17 1994-01-01 07:00:00  3.2   NA 
18 1994-01-01 08:00:00   NA   NA 
19 1994-01-01 09:00:00   NA   NA 
20 1994-01-01 10:00:00   NA   NA 
21 1994-01-01 11:00:00   NA   NA 
22 1994-01-01 12:00:00   NA   NA 
23 1994-01-01 13:00:00   NA   NA 
24 1994-01-01 14:00:00   NA   NA 
25 1994-01-01 15:00:00   NA   NA 

編輯 - 2013年7月6日

這裏是處理兩個以上的數據幀的一種方式。

下面是數據:

df.1 <- read.table(text = ' 
date  time  station210 
1994-01-01 00:00:00 0 
1994-01-01 02:00:00 0 
1994-01-01 03:00:00 0 
1994-01-01 04:00:00 0.6 
1994-01-01 06:00:00 2.6 
1994-01-01 07:00:00 3.2 
', header = TRUE, stringsAsFactors=FALSE) 

df.2 <- read.table(text = ' 
date  time station212 
1994-01-01 00:00:00 0 
1994-01-01 01:00:00 1.8 
1994-01-01 02:00:00 1.8 
1994-01-01 03:00:00 1.8 
1994-01-01 04:00:00 1.4 
1994-01-01 06:00:00 1.8 
', header=TRUE, stringsAsFactors=FALSE) 

df.3 <- read.table(text = ' 
date  time station214 
1993-12-31 22:00:00 5.0 
1993-12-31 23:00:00 2.0 
1994-01-01 02:00:00 1.0 
1994-01-01 04:00:00 3.0 
1994-01-01 06:00:00 5.0 
1994-01-01 08:00:00 4.0 
', header=TRUE, stringsAsFactors=FALSE) 

創建數據幀的列表,並創建變量datetime

my.data <- sapply(paste('df.', seq(1,3,1), sep=''), get, environment(), simplify = FALSE) 

date.time <- function(x) { 
         cols <- c('date' , 'time') 
         x$datetime <- apply(x[ , cols ] , 1 , paste , collapse = " ") 
         x <- x[, 3:4] 
         return(x) 
      } 

my.list <- lapply(my.data, function(x) date.time(x)) 

合併,並在該列表中的數據幀進行排序:

df.3 <- Reduce(function(...) merge(..., all=T), my.list) 
df.3[order(df.3$datetime),] 

在合併的數據框中添加缺失的日期和時間:

df.3$datetime <- format(as.POSIXct(df.3$datetime, format = "%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S") 

hour <- seq(0,60*60*24,by=60*60) 

datetime <- as.POSIXlt(hour, origin="1994-01-01") 

datetime <- format(as.POSIXct(hour, origin="1994-01-01"), "%Y-%m-%d %H:%M:%S" ) 

newdf <- merge(data.frame(datetime), df.3, all.x=TRUE, by="datetime") 
newdf 

這裏是代碼從一個站點用來自同一個站點的前面和後面觀察值的平均值代替缺失的觀測值。我使用嵌套的for-loops這可能是非常低效的。如果我找出更有效的方法,我會盡量記住在這裏發佈。如果你的數據集很大,這些嵌套的for-loops可能需要很長時間才能運行。

newdf2 <- newdf 

for(i in 1:nrow(newdf)) { 
    for(j in 2:ncol(newdf)) { 

      if(i == 1 &     is.na(newdf[i,j])) newdf2[i,j] = newdf[i+1,j] 
      if(i ==   nrow(newdf) & is.na(newdf[i,j])) newdf2[i,j] = newdf[i-1,j] 
      if(i > 1 & i < nrow(newdf) & is.na(newdf[i,j])) newdf2[i,j] = mean(c(newdf[i-1,j], newdf[i+1,j]), na.rm=TRUE) 
      if(is.nan(newdf2[i,j]))       newdf2[i,j] = NA 

    } 
} 

cbind(newdf, newdf2) 
+0

嗨,馬克米勒,謝謝你,那對我很好。但是有一個問題,有沒有辦法讓我們的上一個和下一個時間序列的平均值代替NA? –

+0

嗨馬克米勒,當我做了兩個以上的站,我得到錯誤信息「Error in fix.by(by.x,x): '''必須指定列作爲數字,名稱或邏輯「。你有什麼建議我解決這個問題?在此先感謝 –

+0

@Wuletawu Abera我現在試圖迴應您的問題上面。 –

0

假設rainfall_1rainfall_2有POSIXct date列。現在,將數據幀轉換爲動物園對象,並向示例添加第三個動物園對象z3(等於z2),以顯示其不限於兩個輸入。合併所有三個(動物園的合併句柄多路合併)給予zz,然後合併時間系列與零寬度網格,z0

library(zoo) 

# set up input zoo objects 
z1 <- read.zoo(rainfall_1, FUN = identity) 
z2 <- read.zoo(rainfall_2, FUN = identity) 
z3 <- z2 

zz <- merge(z1, z2, z3) 
z0 <- zoo(, seq(start(zz), end(zz), by = "hour")) 
zout <- merge(zz, z0) 

這給:

> zout 
        z1 z2 z3 
1994-01-01 00:00:00 0.0 0.0 0.0 
1994-01-01 01:00:00 NA 1.8 1.8 
1994-01-01 02:00:00 0.0 1.8 1.8 
1994-01-01 03:00:00 0.0 1.8 1.8 
1994-01-01 04:00:00 0.6 1.4 1.4 
1994-01-01 05:00:00 NA NA NA 
1994-01-01 06:00:00 2.6 1.8 1.8 
1994-01-01 07:00:00 3.2 NA NA 

你不妨見好就收這個動物園採取的其他設施的優勢太多,但如果你想打開它爲數據幀:

library(ggplot2) 
dfout <- fortify(zout)