2017-05-17 5 views
0

私は最近私のマスター論文のためにRを使ってコーディングを開始し、まだ学んでいます。apply.monthly関数(xtsとPOSIXctファイル)で動作しません

いくつかの気象データを処理するために、私は関数を作成しようとしました。 元のファイルは、日付と降水量を含むcsvファイルです。 私は日付を抽出し、すべての私の日付でPOSIXctオブジェクトを作成し、xtsオブジェクトに日付と降水量を加えました。

mesdonnees <- mesdonnees[26000:30000,] 

require('xts') 

# Extract characters and define as S.... 
Syear <- substr(mesdonnees$time, 1, 4) 
Smonth <- substr(mesdonnees$time, 6,7) 
Sday <- substr(mesdonnees$time, 9, 10) 
Shour <- substr(mesdonnees$time, 12, 13) 
Sminutes <- substr(mesdonnees$time, 15, 16) 

#Gather all parts and use "-" as sep 
datetext <- paste(Syear, Smonth, Sday, Shour, Sminutes, sep="-") 
#define format of each part of the string 
formatdate <- as.POSIXct(datetext, format="%Y-%m-%d-%H-%M", tz = "GMT") 

xtsdata <- xts(mesdonnees[,2:3], order.by = formatdate, header = TRUE) 

それからdifftimeの値を合計し、それが<だときに変数xに格納し= 20分未満、またはX 20を追加しdifftimeである場合、変数Yに残っているdifftimeを格納する機能を書い> 20分

myfun <- function(CHANGE){  # CHANGE = formatdate or xtsdata 
x <- as.difftime(0,format = "%M", units = "mins") 
y <- as.difftime(0,format = "%M", units = "mins") 
for (i in 2:length(CHANGE)) { 
    if (difftime(CHANGE[i],CHANGE[i-1],units = "mins") <= as.difftime(20,format = "%M",units = "mins")) { 
    x <- x + difftime(CHANGE[i],CHANGE[i-1],units = "mins") 
    } else { 
    x <- x + 20 
    y <- y + difftime(CHANGE[i],CHANGE[i-1],units = "mins") - 20 
    } 
    } 
return(list(paste("x = ",x , sep = ""),paste("y = ",y , sep = ""))) 
} 

この関数は、'as.POSIXct'オブジェクト(は、FormatDate)で作業する場合、本当にうまく動作しますが、私は'xts'オブジェクト(xtsdata)でそれを実行しようとすると、動作しません。そうすると、私は次のエラーを受け取ります:do not know how to convert 'x' to class “POSIXlt”。時差があるとxがPOSIXctに変更されるのはなぜですか?

私がうまく動作できない次のステップは、 `apply.monthly(xtsdata、myfun)を使ってapply.monthlyをこの関数に使用しています。

現在、apply.monthly(formatdate,myfun)を使用しようとすると、私は次のエラーを取得:Error in if (difftime(CHANGE[i], CHANGE[i - 1], units = "mins") <= as.difftime(20, : missing value where TRUE/FALSE needed

をしてapply.monthly(xtsdata,myfun)をしようとしたとき、私は次のエラーを取得:私の機能が正常に動作し、どのように取得する方法についてError in as.POSIXlt.default(x, tz, ...) : do not know how to convert 'x' to class “POSIXlt”

何かアドバイスをapply.monthlyを適用すると大きな助けになります。 ありがとうございました!詳細については


編集:(SID:メテオデータの識別、私はその列を必要としない)、時間=日付、値=降雨私は降雨を推定する必要が

> head(mesdonnees) 
     sid    time value 
26000 100 2010-07-14 11:50:00  0 
26001 100 2010-07-14 12:10:00  0 
26002 100 2010-07-14 12:20:00  0 
26003 100 2010-07-14 12:30:00  0 
26004 100 2010-07-14 12:41:00  0 
26005 100 2010-07-14 12:50:00  0 

> head(formatdate) 
[1] "2010-07-14 11:50:00 GMT" "2010-07-14 12:10:00 GMT" 
[3] "2010-07-14 12:20:00 GMT" "2010-07-14 12:30:00 GMT" 
[5] "2010-07-14 12:41:00 GMT" "2010-07-14 12:50:00 GMT" 

> head(xtsdata) 
        time     value 
2010-07-14 11:50:00 "2010-07-14 11:50:00" " 0.00" 
2010-07-14 12:10:00 "2010-07-14 12:10:00" " 0.00" 
2010-07-14 12:20:00 "2010-07-14 12:20:00" " 0.00" 
2010-07-14 12:30:00 "2010-07-14 12:30:00" " 0.00" 

それらのデータ(メドンドーン)から月に1回。最初のデータは正確な時間に「即時沈殿」をもたらし、10分ごとに値を取得する必要があります。しかし、それは事実ではなく、時には後日まで値がありません(欠損値に気づくための行はNAではありません)。 この説明がよければ幸いですか?

+0

データがどのように見えるかを知るために 'head(mesdonnees) 'を実行できますか?あなたが解決しようとしている根底にある問題は何ですか? 「気象データを扱う」と書いたとき、どのような扱いをしていますか? – AkselA

答えて

0

おそらくあなたのCSVをxtsまたはzooオブジェクトに直接読み込むことができます。しかし、あなたはCSVのデータの形式を指定しないので、私の答えはmesdonneesがdata.frameだと仮定します。

あなたはXTSオブジェクトを作成するために必要なすべてがあり、sid列を必要としないので:

mesdonnees$timeが要因である場合には
xtsdata <- xts(mesdonnees$value, as.POSIXct(mesdonnees$time)) 

、あなたはそれを変換する必要があります文字を最初に。

xtsdata <- xts(mesdonnees$value, as.POSIXct(as.character(mesdonnees$time))) 

次に、あなたが月ごとに要約統計を作成するために使用したいものは何でも機能付きapply.monthly(xtsdata, ...)を呼び出すことができます。例:

apply.monthly(xtsdata, quantile) 
+0

こんにちは、あなたの助言をいただきありがとうございます! 'xts'の作成にかなりの部分が保存されますが、' xts'オブジェクトに 'difftime'関数を使用することはできません(Rは' 'x''を' 'POSIXlt'''に変換できない、 – legardien

+0

@legardien:なぜdifftimeを使用する必要があるのか​​不明です。 最後に、データに関する追加情報とユニットに関するいくつかの修正を受けました。これは、基本的な 'apply.monthly(xtsdata、mean)'を実行し、これを処理できることを意味します。 'xts'作成をありがとうヒント、それは私のコードをはるかに短く、きれいにします。 –

+0

2つの行の間の差が20分を超えないようにするには 'difftime'が必要でした(関数で使用しました)。これは、日付形式を認識しますが、 – legardien

関連する問題