2013-06-05 28 views
0

我正在研究R中的一個大數據集,其中包含FY(6級),Region(10級)和Service(24級)三個因子。我需要在所有三個層次上總結我的數值向量SumOfUnits,而我認爲這樣做的唯一方法是將數據幀分成第一個:由FY分割的6個數據幀,然後將這6個數據分成10個數據幀,在區域上分割,然後將這10個分割成24個服務,然後我可以最終獲得數字向量的總和並將所有數據幀重新組合爲一個。這個數據幀將有6 * 10 * 24(1440)行和4列。我現在正在做這件事的方式涉及到很多分裂,所以我認爲可能有一個函數我可以寫,我可以在分裂的每個級別使用,但我沒有在R中非常使用「函數」我不確定寫什麼(如果有的話)。我也想象可能有一種更有效的方式來獲得格式化的數據集,所以我歡迎所有的建議。創建一個函數來分割數據幀多次然後重新組合

這裏是從我的數據幀中的幾行:

FY Region Service    SumOfUnits 
1 2006 1  Medication     13 
2 2006 1  Medication     1 
3 2006 1  Screening & Assessment 38 
4 2006 1  Screening & Assessment 13 
5 2006 1  Screening & Assessment 41 
6 2006 1  Screening & Assessment 67 
7 2006 1  Screening & Assessment 222 
8 2006 1  Residential Treatment  38 
9 2006 1  Residential Treatment  1558 

這是我一直在使用我的分裂代碼:

# Creating a data frame by year 
X <- split(MIC, MIC$FY) 

Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, ]) 
#Assign the dataframes in the list Y to individual objects 
A <- Y[[1]] 
B <- Y[[2]] 
C <- Y[[3]] 
D <- Y[[4]] 
E <- Y[[5]] 
Q <- Y[[6]] 

#Creating 10 dataframes from 2006 split by region 
X <- split(A, A$Region) 

Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, ]) 

Reg1 <- Y[[1]] 
Reg2 <- Y[[2]] 
Reg3<- Y[[3]] 
Reg4 <- Y[[4]] 
Reg5<- Y[[5]] 
Reg6 <- Y[[6]] 
Reg7 <- Y[[7]] 
Reg8 <- Y[[8]] 
Reg9 <- Y[[9]] 
Reg10<- Y[[10]] 

#Creating 24 dataframes: for 2006, region 1 
X <- split(Reg1, Reg1$Service) 

Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, ]) 

Serv1 <- Y[[1]] 
Serv2 <- Y[[2]] 
Serv3<- Y[[3]] 
Serv4 <- Y[[4]] 
Serv5<- Y[[5]] 
#etc... 

我希望我的數據的一個樣本看起來像這樣:

FY Region Service SumOfUnits 
2006 1  Medication 4300 
2006 2  Medication 3299 
2006 3  Medication 2198 
2007 1  Medication 5467 
2007 2  Medication 3214 
2007 3  Medication 9807 
+2

你有沒有看plyr? –

+1

......甚至只是「聚合」,對吧? – joran

+0

我已經嘗試過,但無法弄清楚如何在3個因素的水平使用它們。例如,我可以這樣做: 'library(plyr) Sum_Year < - na.omit(ddply(MIC [c(4)],。(FY,Region,Service),colSums,na。 rm = TRUE))' 但由於每個服務的行數不均勻,我得到一個錯誤。如果我只使用FY運行相同的代碼,它就可以運行,但我需要按FY,區域和服務對其進行分解 – idemanalyst

回答

2

這是相當不錯的功能來做到這一點:

library(plyr) 
ddply(MIC, .(FY, Region, Service), summarize, sumOfUnits=sum(SumOfUnits)) 

它給出了你所需要的。

對於MIC =

FY  Region Service SumOfUnits 
1 2006  1  A   1 
2 2006  2  B   4 
3 2007  1  C   3 
4 2007  2  D   2 
5 2007  2  E   7 
6 2006  1  A   3 
7 2007  1  D   3 
8 2007  2  B   4 
9 2007  2  B   6 

回報:

FY  Region Service sumOfUnits 
1 2006  1  A 4 
2 2006  2  B 4 
3 2007  1  C 3 
4 2007  1  D 3 
5 2007  2  B 10 
6 2007  2  D 2 
7 2007  2  E 7 
+0

做到了!謝謝! – idemanalyst

+0

我很高興能幫上忙。 – storaged