5

私はしばらくこれに苦労してきました。tsデータと関連するすべての R パッケージを扱うのは初めてです。GMT「%H%M」の「時刻」や「%Y/%m/%e」サンプリングが発生した日付など、いくつかの変数を持つ df があります。日付データを「週」(つまり、%W/%g) にビン化/集計し、その週にサンプリングが行われた平均「時刻」を計算したいと考えています。

最初に df を Zoo オブジェクトに変換してから、次のように aggregate.zoo コマンドを使用することで、数値変数 (体重など) で他の FUN を計算することができました。

#calculate the sum weight captured every week 
x2c <- aggregate(OA_zoo, as.Date(cut(time(OA_zoo), "week")), sum)

ただし、数値ではなく日付形式を使用しているという事実を回避する方法がわかりません。ヒントをいただければ幸いですまた、私は明らかに、各変数を個別に実行することで、多くの方法でコーディングを行ってきました。plyr を使用して「毎週」集計することにより、df に異なる FUN (合計/平均/最大/最小) を適用する方法はありますか? それとも他のパッケージ?

編集/明確化これdputは、私の完全なデータセットのサンプルの出力です 。2004 年から 2011 年までのデータがあります。ggplot2 を使用して確認/プロットしたいのは、一定期間 (2004 ~ 2011 年) の週単位で集計された TIME (%H%M) の平均/中央値です。現在、私のデータは週単位ではなく、日単位 (ランダム サンプル) で集計されています。

> dput(godin)
structure(list(depth = c(878, 1200, 1170, 936, 942, 964, 951, 
953, 911, 969, 960, 987, 991, 997, 1024, 978, 1024, 951, 984, 
931, 1006, 929, 973, 986, 935, 989, 1042, 1015, 914, 984), duration = c(0.8, 
2.6, 6.5, 3.2, 4.1, 6.4, 7.2, 5.3, 7.4, 7, 7, 5.5, 7.5, 7.3, 
7.5, 7, 4.2, 3, 5, 5, 9.3, 7.9, 7.3, 7.2, 7, 5.2, 8, 6, 7.5, 
7), Greenland = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 40L, 28L, 0L, 
0L, 34L, 7L, 28L, 0L, 0L, 0L, 27L, 0L, 0L, 0L, 44L, 59L, 0L, 
0L, 0L, 0L, 0L, 0L), date2 = structure(c(12617, 12627, 12631, 
12996, 12669, 13036, 12669, 13036, 12670, 13036, 12670, 13037, 
12671, 13037, 12671, 13037, 12671, 13038, 12672, 13038, 12672, 
13038, 12672, 13039, 12631, 12997, 12673, 13039, 12673, 13039
), class = "Date"), TIME = c("0940", "0145", "0945", "2045", 
"1615", "0310", "2130", "1045", "0625", "1830", "1520", "0630", 
"0035", "1330", "0930", "2215", "2010", "0645", "0155", "1205", 
"0815", "1845", "2115", "0350", "1745", "0410", "0550", "1345", 
"1515", "2115")), .Names = c("depth", "duration", "Greenland", 
"date2", "TIME"), class = "data.frame", row.names = c("6761", 
"9019", "9020", "9021", "9022", "9023", "9024", "9025", "9026", 
"9027", "9028", "9029", "9030", "9031", "9032", "9033", "9034", 
"9035", "9036", "9037", "9038", "9039", "9040", "9041", "9042", 
"9043", "9044", "9045", "9046", "9047"))
4

3 に答える 3

3

私は次のようにアプローチします。最初に、週を表す文字列を含む列を作成します。

godin$week <- format(godin$date2, "%Y-W%U")

これにより、 のようなものが得られます。"2004-W26"これで十分ですaggregate

次に、HHMM を表す文字ベクトルを実際の時間に変換して、時間計算を使用できるようにする必要があります。

godin$time2 <- as.POSIXct(strptime(godin$TIME, "%H%M"))

注: 上記は少しハックです...strptime()何も指定されていない場合は現在の日付を想定していますが、変換されたすべての時刻は同じ日付、時刻の部分を持つため、この特定のアプリケーションの邪魔にはなりません。平均は正しいでしょう。後で日付を削除します...

その時点で、単純に集計できると思います。

x2c <- aggregate(time2~week, data=godin, FUN=mean)

無関係な(そして誤った)日付部分を取り除きます

x2c$time2 <- format(x2c$time2,"%H:%M:%S")

et出来上がり。

> x2c
      week    time2
1 2004-W29 09:40:00
2 2004-W30 01:45:00
3 2004-W31 13:45:00
4 2004-W36 12:07:00
5 2004-W37 10:32:30
6 2005-W31 12:27:30
7 2005-W36 10:48:20
8 2005-W37 13:11:06

ここでの教訓は、R で日付が関連付けられていない時間をプッシュするのは難しいということです。これを行うためのより良い方法を持っている他の人から聞いてみたいです。

于 2012-07-17T17:52:38.470 に答える
2

TIME列を一般的な単位(つまり分)に変換する必要があります。これを行うためのいくつかのヘルパー関数を次に示します。

hour2min <- function(hhmm) {
  hhmm <- as.numeric(hhmm)
  trunc(hhmm/100)*60 + hhmm %% 100
}
min2hour <- function(min) {
  min <- as.numeric(min)
  trunc(min/60)*100 + min %% 60
}

次に、必要に応じて議事録を集計できます。私は個人的にそれらをxtsオブジェクトに入れて使用しますapply.weekly

library(xts)
x <- xts(hour2min(godin$TIME), as.Date(godin$date2), dimnames=list(NULL,"MINS"))
w <- apply.weekly(x, mean)
w$TIME <- min2hour(w$MINS)
#                MINS     TIME
# 2004-07-18 580.0000  940.000
# 2004-08-01 585.0000  945.000
# 2004-09-12 711.2500 1151.250
# 2005-08-02 747.5000 1227.500
# 2005-09-11 746.6667 1226.667
# 2005-09-13 764.1667 1244.167

秒はまだ100分の1分ですが、変更される可能性があります...

于 2012-07-17T18:03:18.570 に答える
1

週あたりのすべての観測時間の平均が必要で、日付を重要にしたい場合(つまり、今日の19:00と明日の19:00の平均は明日の朝の07:00になります)、これを行うことができます。

godin$datetime <- as.POSIXct(paste(godin$date2, godin$TIME), format="%Y-%m-%d %H%M")
aggregate(godin$datetime, list(format(godin$datetime, "%W/%g")), mean)

#  Group.1                   x
#1   28/04 2004-07-18 09:40:00
#2   30/04 2004-07-31 01:45:00
#3   31/05 2005-08-02 00:27:30
#4   36/04 2004-09-10 13:51:15
#5   36/05 2005-09-11 00:26:40
#6   37/05 2005-09-13 00:44:10

ただし、平均的な時間が必要であり、日付は気にしないと思います(週を決定する場合を除く)。その場合、任意の日付をアンカーとして使用し、常にその日付に発生するように扱うことができます。

godin$stime <- as.POSIXct(paste("1970-01-01", godin$TIME), format='%Y-%m-%d %H%M')
aggregate(godin$stime, list(format(godin$datetime, "%W/%g")), mean)

#  Group.1                   x
#1   28/04 1970-01-01 09:40:00
#2   30/04 1970-01-01 09:45:00
#3   31/05 1970-01-01 12:27:30
#4   36/04 1970-01-01 11:51:15
#5   36/05 1970-01-01 12:26:40
#6   37/05 1970-01-01 12:44:10

編集

上記の出力と@JoshuaUlrichが提供した出力の違いは、彼が週でソートされていることです。並べ替えると、ジョシュアのようになりますが、100分の1分ではなく秒になります。format(ただし、選択した仕様のため、同じ方法で並べ替えるのは少し注意が必要です。)

out <- aggregate(godin$stime, list(format(godin$datetime, "%W/%g")), mean)
out[order(as.numeric(paste0(substr(out[, 1], 4, 5), substr(out[, 1], 1, 2)))), ]
#  Group.1                   x
#1   28/04 1970-01-01 09:40:00
#2   30/04 1970-01-01 09:45:00
#4   36/04 1970-01-01 11:51:15
#3   31/05 1970-01-01 12:27:30
#5   36/05 1970-01-01 12:26:40
#6   37/05 1970-01-01 12:44:10

編集2

次のような形式の文字列を取得したい場合は、format内部に入ることができます。aggregate%H%M

out <- aggregate(godin$stime, list(format(godin$datetime, "%W/%g")), function(TIME) format(mean(TIME), "%H%M"))
out[order(as.numeric(paste0(substr(out[, 1], 4, 5), substr(out[, 1], 1, 2)))), ]
#  Group.1    x
#1   28/04 0940
#2   30/04 0945
#4   36/04 1151
#3   31/05 1227
#5   36/05 1226
#6   37/05 1244
于 2012-07-17T18:02:56.903 に答える