2011-03-28 146 views
5

繼我的previous question關於將每小時數據彙總爲日常數據後,我想繼續(a)每月彙總和(b)將月度彙總合併到原始數據框中。合併R中的彙總數據

我原來的數據幀是這樣的:

Lines <- "Date,Outdoor,Indoor 
01/01/2000 01:00,30,25 
01/01/2000 02:00,31,26 
01/01/2000 03:00,33,24 
02/01/2000 01:00,29,25 
02/01/2000 02:00,27,26 
02/01/2000 03:00,39,24 
12/01/2000 02:00,27,26 
12/01/2000 03:00,39,24 
12/31/2000 23:00,28,25" 

日聚集在我previous question得到回答,然後我可以找到我的方式來生產從那裏每月彙總,對這樣的事情:

Lines <- "Date,Month,OutdoorAVE 
01/01/2000,Jan,31.33 
02/01/2000,Feb,31.67 
12/01/2000,Dec,31.33" 

凡OutdoorAVE是每日最低和最高室外溫度的月平均。我最終想要的是這樣的:

Lines <- "Date,Outdoor,Indoor,Month,OutdoorAVE 
01/01/2000 01:00,30,25,Jan,31.33 
01/01/2000 02:00,31,26,Jan,31.33 
01/01/2000 03:00,33,24,Jan,31.33 
02/01/2000 01:00,29,25,Feb,31.67 
02/01/2000 02:00,27,26,Feb,31.67 
02/01/2000 03:00,39,24,Feb,31.67 
12/01/2000 02:00,27,26,Dec,31.33 
12/01/2000 03:00,39,24,Dec,31.33 
12/31/2000 23:00,28,25,Dec,31.33" 

我不知道如何做到這一點。任何幫助是極大的讚賞。

回答

2

嘗試ave和如POSIXlt提取一個月:

zz <- textConnection(Lines) 
Data <- read.table(zz,header=T,sep=",",stringsAsFactors=F) 
close(zz) 

Data$Month <- strftime(
    as.POSIXlt(Data$Date,format="%m/%d/%Y %H:%M"), 
    format='%b') 
Data$outdoor_ave <- ave(Data$Outdoor,Data$Month,FUN=mean) 

給出:

> Data 
       Date Outdoor Indoor Month outdoor_ave 
1 01/01/2000 01:00  30  25 Jan 31.33333 
2 01/01/2000 02:00  31  26 Jan 31.33333 
3 01/01/2000 03:00  33  24 Jan 31.33333 
4 02/01/2000 01:00  29  25 Feb 31.66667 
5 02/01/2000 02:00  27  26 Feb 31.66667 
6 02/01/2000 03:00  39  24 Feb 31.66667 
7 12/01/2000 02:00  27  26 Dec 31.33333 
8 12/01/2000 03:00  39  24 Dec 31.33333 
9 12/31/2000 23:00  28  25 Dec 31.33333 

編輯:數據然後就calcualte月如上圖所示,用合併:

zz <- textConnection(Lines2) # Lines2 is the aggregated data 
Data2 <- read.table(zz,header=T,sep=",",stringsAsFactors=F) 
close(zz) 

> merge(Data,Data2[-1],all=T) 
    Month    Date Outdoor Indoor OutdoorAVE 
1 Dec 12/01/2000 02:00  27  26  31.33 
2 Dec 12/01/2000 03:00  39  24  31.33 
3 Dec 12/31/2000 23:00  28  25  31.33 
4 Feb 02/01/2000 01:00  29  25  31.67 
5 Feb 02/01/2000 02:00  27  26  31.67 
6 Feb 02/01/2000 03:00  39  24  31.67 
7 Jan 01/01/2000 01:00  30  25  31.33 
8 Jan 01/01/2000 02:00  31  26  31.33 
9 Jan 01/01/2000 03:00  33  24  31.33 
+0

@Joris Meys:我的問題是outdoorAVE位於另一個數據框(如Data.Month)上,該數據框僅包含月份和平均列,並且一年只有12行。戶外活動的計算方法與上面所寫的不同,但是來自年度小時數據的彙總數據(每日然後每月)。所以我想要的是在原始數據框(例如上面的例子中的數據)中添加一列,其中列是從另一個數據集(例如Data.Monthly)獲取的。 – ery 2011-03-28 22:52:21

+0

@ery:編輯我的答案,告訴你如何使用合併 – 2011-03-28 23:01:56

+0

@ery:在你的評論中,你說'Data.Monthly'只有2列(月份和平均值),但它在原始問題中有3列。 – 2011-03-28 23:02:36

0

這是一個動物園/ xts解決方案。請注意,Month在這裏是數字,因爲您不能在zoo/xts對象中混合類型。

require(xts) # loads zoo too 
Lines1 <- "Date,Outdoor,Indoor 
01/01/2000 01:00,30,25 
01/01/2000 02:00,31,26 
01/01/2000 03:00,33,24 
02/01/2000 01:00,29,25 
02/01/2000 02:00,27,26 
02/01/2000 03:00,39,24 
12/01/2000 02:00,27,26 
12/01/2000 03:00,39,24 
12/31/2000 23:00,28,25" 
con <- textConnection(Lines1) 
z <- read.zoo(con, header=TRUE, sep=",", 
    format="%m/%d/%Y %H:%M", FUN=as.POSIXct) 
close(con) 

zz <- merge(z, Month=.indexmon(z), 
    OutdoorAVE=ave(z[,1], .indexmon(z), FUN=mean)) 
zz 
#      Outdoor Indoor Month OutdoorAVE 
# 2000-01-01 01:00:00  30  25  0 31.33333 
# 2000-01-01 02:00:00  31  26  0 31.33333 
# 2000-01-01 03:00:00  33  24  0 31.33333 
# 2000-02-01 01:00:00  29  25  1 31.66667 
# 2000-02-01 02:00:00  27  26  1 31.66667 
# 2000-02-01 03:00:00  39  24  1 31.66667 
# 2000-12-01 02:00:00  27  26 11 31.33333 
# 2000-12-01 03:00:00  39  24 11 31.33333 
# 2000-12-31 23:00:00  28  25 11 31.33333 

更新:如何使用兩個不同的數據集獲得上述結果。

Lines2 <- "Date,Month,OutdoorAVE 
01/01/2000,Jan,31.33 
02/01/2000,Feb,31.67 
12/01/2000,Dec,31.33" 
con <- textConnection(Lines2) 
z2 <- read.zoo(con, header=TRUE, sep=",", format="%m/%d/%Y", 
    FUN=as.POSIXct, colClasses=c("character","NULL","numeric")) 
close(con) 

zz2 <- na.locf(merge(z1, Month=.indexmon(z1), OutdoorAVE=z2))[index(z1)] 
# same output as zz (above) 
+0

我試過這個,但是這個月一年總是11。 – ery 2011-03-28 23:16:06

+0

@ery:請參閱我的編輯。我不確定爲什麼月份總是11 ...也許您的示例數據和實際數據有所不同? – 2011-03-29 13:36:15

2

這是切你的問題,但你可能需要使用RSQLite及各種統計值的單獨的表來代替,並加入簡單的SQL命令表。如果您使用多種聚合,您的數據框可能會變得很大而且很難看。

+0

這是一個很好的解決方案,但我甚至不知道如何在SQLite中導入日期/時間,更不用說按月或日進行分組。任何幫助? – ery 2011-03-29 21:36:06

+1

您的整個問題都可以在SQL中解決。我沒有說你應該使用SQL來進行聚合,但知道它是如何工作的(相當容易)很有用。我建議你做一些閱讀並在不同的線索中提出你的問題。 – GaBorgulya 2011-03-30 00:32:37