2

15 年間の 1 時間ごとの降水量データを含む 10 の観測所があります。すべてのシリーズに数時間、さらには数日がランダムにジャンプします。15 年間のすべての時間ステップをインデックスとして使用し、すべてのステーション データを 1 つのデータ フレームに結合し、各ステーションのジャンプに 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

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 

いくつかの問題は、2 番目のデータ フレーム (rainfall_2) の 2 行目が欠落していることと、両方のデータ フレームに存在しない 5 時間目の値が欠落していることです。私は、2 番目の時間ステップ (2 時間) が含まれ、その近隣の NA または平均であり、5 時間目の時間ステップが両方の近隣の NA または平均値を与えるソリューションを探していました。

これらの時系列データが、ランダムな間隔で欠落している多くのステーションの数千のものであると想像してください。

4

2 に答える 2

0

これはあなたが望むことをするかもしれないと思います。最終的にマージされたデータセットが 1 月 1 日の真夜中ではなく、12 月 31 日の午後 3 時に開始される理由がわかりません。これは、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 日

2 つ以上のデータ フレームを処理する 1 つの方法を次に示します。

データは次のとおりです。

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)
于 2013-06-28T09:24:11.043 に答える
0

POSIXct列があると仮定rainfall_1します。ここで、データ フレームを Zoo オブジェクトに変換し、3 つ目の Zoo オブジェクト( に等しい) を例に追加して、2 つの入力に限定されないことを示します。3 つすべてをマージして (zoo のマージは多方向マージを処理します) 、組み合わせた時系列をゼロ幅グリッドでマージします。 rainfall_2datez3z2zzz0

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

これを Zoo に残しておき、他の機能も利用したい場合がありますが、データ フレームに戻したい場合は、次のようにします。

library(ggplot2)
dfout <- fortify(zout)
于 2013-06-28T12:14:15.493 に答える