2013-07-15 82 views
3

我是「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分鐘,這取決於所述週期完成。我想計算每個變量的年度,月度和日平均值,無論一天/一年/一年的數據量是多少。我讀了很多關於包動物園,時間序列,xts等的東西,但是我無法清楚地瞭解到我的缺點(也許是因爲我對R不夠熟練)。

我希望我的帖子很明確,不要猶豫,告訴我,如果不是。

回答

6

將您的數據轉換爲xts對象,然後使用apply.daily等計算出您想要的值。

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 
+0

非常感謝您的回答。好處是,用xts我可以要求每週平均。我嘗試了你的代碼,我的整個數據集都遇到了一些問題,所以我嘗試修復它,並且保持聯繫!再次感謝你 ! –

+0

沒關係,日間和月份剛剛倒過來(%m /%d >>>%d /%m)。謝謝 ! –

3

我想將日,月和年添加到數據框中,然後使用aggregate()

首先將您date列到POSIXct OBJET:

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周爲一年中的第一個星期。星期一至星期日。

+0

您對'format'的調用不起作用。'日期'列不是'POSIXct'對象。它可能是一個角色或(更可能)一個因素。 –

+0

@JoshuaUlrich注意。固定。 –

+0

非常感謝您的回答!這個工作完美后,我也做了回答1(日間和月份倒置,我想這是一個國家的差異,原因在法國,我們在一個月的前一天;)。就像我問Jdbaba一樣,有沒有辦法像圖書館的圖書館一樣計算圖書館員的每週平均數? –

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 
+0

非常感謝您的回答!這個工作完美后,我也做了回答1(日間和月份倒置,我想這是一個國家的差異,原因在法國,我們在一個月的前一天;)。有沒有一種方法可以像圖書館的圖書館一樣計算每週的平均數? –

1

hydroTSM擁有多種功能,以創造年度和其他摘要:

daily2annual(x, ...) 
subdaily2annual(x, ...) 
monthly2annual(x, ...) 
annualfunction(x, FUN, na.rm = TRUE, ...) 
相關問題