2013-08-22 160 views
5

遍歷數據幀中提取數據的子集,我有一個包含數據的大數據幀,看起來是這樣的:R:根據日期

 date w x y z region 
1 2012 01 21 43 12 3 NORTH 
2 2012 02 32 54 21 16 NORTH 
3 2012 03 14 32 65 32 NORTH 
4 2012 04 65 33 75 21 NORTH 
:  :  : : : :  : 
:  :  : : : :  : 
12 2012 12 32 58 53 17 NORTH 
13 2012 01 12 47 43 23 SOUTH 
14 2012 02 87 43 21 76 SOUTH 
:  :  : : : :  : 
25 2012 01 12 46 84 29 EAST 
26 2012 02 85 29 90 12 EAST 
:  :  : : : :  : 
:  :  : : : :  : 

我想提取有數據的部分同樣date值,例如只是爲了2012 01做到這一點,我只想創建數據

data_1 <- subset(data, date == "2012 01") 

的一個子集,這給了我所有的數據2012 01但後來我去到一個功能應用到這些數據。我希望能夠將我的函數應用於所有可能的數據子集,因此理想情況下,我將遍歷我的大數據框並提取數據,並分別對這些數據子集中的每一個應用函數。

但是我想能夠將其應用到我的數據幀,即使我的數據幀的長度進行了更改,所以它可能不會總是從2012 01 - 2012 12去,日期的範圍可能會有所不同,這樣有時可以使用來自例如2011 03 - 2013 01的數據。

回答

9

這是你想要的嗎? df_list <- split(data, as.factor(data$date))

+0

這是完美的!對於我認爲的東西,這樣一個簡單的答案會複雜得多,謝謝 – userk

0

您可以分割你的data.framedata.frames一個list這樣的:

list.of.dfs<-by(data,data$date) 
+0

似乎沒有工作。 () –

0

這是plyr包一個完美的境地:

require(plyr) 
ddply(my_df, .(date), my_function, extra_arg_1, extra_arg_2) 

其中my_function是你想要的功能在分離的數據幀上執行,並且extra_arg是需要轉到該功能的任何額外參數。

ddplyd ata frame - >d ata frame)如果您希望在數據框中獲得結果,您可以使用這種形式; dlply返回一個列表。

14

遍歷每個唯一日期並構建子集。

uniq <- unique(unlist(data$Date)) 
for (i in 1:length(uniq)){ 
    data_1 <- subset(data, date == uniq[i]) 
    #your desired function 
} 
+0

我也很喜歡這個答案,謝謝 – userk

+0

每個子集都有一個唯一的名字嗎?從我看到的你最終將每個子集放在一個數據框中。 Thx – BlackHat

+0

每個循環都不會覆蓋'data_1',然後用戶可以將任何函數應用於數據框並選擇自己在哪裏存儲結果。 – TylerDurden

2

子設定日期數據集中之後,想象你想申請到每個子集的功能是找到列x的平均值。你可以這樣做:(df是你的數據幀)

library(plyr) 
ddply(df, .(date), summarize, mean = mean(x))