4

私は「R」の新しいユーザーであり、それを解決するための良い解決策を見つけることができませんでした. 次の形式の時系列を取得しました。

>dates  temperature depth   salinity
>12/03/2012 11:26   9.7533  0.48073 37.607
>12/03/2012 11:56   9.6673  0.33281 37.662
>12/03/2012 12:26   9.6673  0.33281 37.672

私は、期間に応じて 15 分ごとまたは 30 分ごとに行われる可変測定の不規則な頻度を持っています。日/月/年のデータ数に関係なく、変数ごとに年次、月次、日次の平均を計算したいと考えています。パッケージzoo、timeseries、xtsなどについて多くのことを読みましたが、必要なものについて明確なビジョンを得ることができません(おそらく、Rのスキルが十分でないためです...)。

私の投稿が明確であることを願っています。そうでない場合は、遠慮なく教えてください。

4

4 に答える 4

6

データを xts オブジェクトに変換し、apply.dailyet al を使用して必要な値を計算します。

library(xts)
d <- structure(list(dates = c("12/03/2012 11:26", "12/03/2012 11:56", 
"12/03/2012 12:26"), temperature = c(9.7533, 9.6673, 9.6673), 
    depth = c(0.48073, 0.33281, 0.33281), salinity = c(37.607, 
    37.662, 37.672)), .Names = c("dates", "temperature", "depth", 
"salinity"), row.names = c(NA, -3L), class = "data.frame")
x <- xts(d[,-1], as.POSIXct(d[,1], format="%m/%d/%Y %H:%M"))
apply.daily(x, colMeans)
#                     temperature     depth salinity
# 2012-12-03 12:26:00    9.695967 0.3821167   37.647
于 2013-07-15T15:47:48.163 に答える
3

日、月、年をデータ フレームに追加してから、aggregate().

まず、date列を POSIXct オブジェクトに変換します。

d$timestamp <- as.POSIXct(d$dates,format = "%m/%d/%Y %H:%M",tz ="GMT")

次に、日付 (例: 12/03/2012) を という列に取得し、Dateこれを試してください:

d$Date <- format(d$timestamp,"%y-%m-%d",tz = "GMT")

次に、日付別に集計します。

aggregate(cbind("temperature.mean" = temperature,
                "salinity.mean" = salinity) ~ Date,
          data = d,
          FUN = mean)

同様に、月を列に入れることができます (それMを月と呼びましょう)、そして...

d$M <- format(d$timestamp,"%B",tz = "GMT")

aggregate(cbind("temperature.mean" = temperature,
                "salinity.mean" = salinity) ~ M,
          data = d,
          FUN = mean)

または、年月が必要な場合

d$YM <- format(d$timestamp,"%y-%B",tz = "GMT")

aggregate(cbind("temperature.mean" = temperature,
                "salinity.mean" = salinity) ~ YM,
          data = d,
          FUN = mean)

データに NA 値がある場合は、それらを考慮する必要がある場合があります。

aggregate(cbind("temperature.mean" = temperature,
                "salinity.mean" = salinity) ~ YM,
          data = d,
          function(x) mean(x,na.rm = TRUE))

最後に、週単位で平均したい場合は、それも可能です。最初に週番号を生成してから、aggregate()再度使用します。

d$W <- format(d$timestamp,"%W",tz = "GMT")

aggregate(cbind("temperature.mean" = temperature,
                "salinity.mean" = salinity) ~ W,
          data = d,
          function(x) mean(x,na.rm = TRUE))

このバージョンの週番号は、週 1 をその年の最初の月曜日の週として定義します。週は月曜日から日曜日までです。

于 2013-07-15T15:56:15.770 に答える
1

このパッケージhydroTSMには、年次およびその他の要約を作成するための複数の関数が含まれています。

daily2annual(x, ...)
subdaily2annual(x, ...)
monthly2annual(x, ...)
annualfunction(x, FUN, na.rm = TRUE, ...)
于 2013-09-20T16:30:20.090 に答える
1

さらに、plyr を使用した別の方法:

df <- structure(list(dates = c("12/03/2012 11:26", "12/03/2012 11:56", 
   "12/03/2012 12:26"), temperature = c(9.7533, 9.6673, 9.6673), 
   depth = c(0.48073, 0.33281, 0.33281), salinity = c(37.607, 
   37.662, 37.672)), .Names = c("dates", "temperature", "depth",                                                                                                
  "salinity"), row.names = c(NA, -3L), class = "data.frame")

library(plyr)

# Change date to POSIXct
df$dates <- with(d,as.POSIXct(dates,format="%m/%d/%Y %H:%M"))

# Make new variables, year and month
df <- transform(d,month=as.numeric(format(dates,"%m")),year=as.numeric(format(dates,"%Y")))

## According to year
ddply(df,.(year),summarize,meantemp=mean(temperature),meandepth=mean(depth),meansalinity=mean(salinity))
  year meantemp meandepth meansalinity
1 2012 9.695967 0.3821167       37.647

## According to month
ddply(df,.(month),summarize,meantemp=mean(temperature),meandepth=mean(depth),meansalinity=mean(salinity))
  month meantemp meandepth meansalinity
1    12 9.695967 0.3821167       37.647
于 2013-07-15T16:22:10.187 に答える