2014-06-19 27 views
3

我有一個描述某些位置的數據集。根據分類預測因子,我在一些地點彙總了一些響應度量y。我得到這個類型數據幀的爲輸出將聚合函數的輸出重新排列成一個新表

location<-c('site1','site1','site1','site2','site2','site3','site3','site3','site3') 
p<-c('A','B','C','A','B','A','B','C','D') 
y<-c(1,2,3,1,2,1,2,3,4) 

data.frame(location,p,y) 

我要的是一個數據幀,看起來像這樣

p<-c('A','B','C','D') 
site1<-c(1,2,3,NA) 
site2<-c(1,2,NA,NA) 
site3<-c(1,2,3,4) 

data.frame(p,site1,site2,site3) 

有一個簡單的方法R中做到這一點?

+1

什麼一個很好再現的問題! – Gregor

回答

4
df1 <- data.frame(location,p,y) 
library(reshape2) 
dcast(df1, p ~ location, value.var = "y") 

## p site1 site2 site3 
## 1 A  1  1  1 
## 2 B  2  2  2 
## 3 C  3 NA  3 
## 4 D NA NA  4 
+0

這完全有效,但repsonse G. Grothendieck不需要安裝包裝。 – colin

2

tapply可以做到這一點。第一個論點是在表體和第二個參數指定的行和列:

tapply(DF[[3]], DF[2:1], c) 

捐贈:

location 
p site1 site2 site3 
    A  1  1  1 
    B  2  2  2 
    C  3 NA  3 
    D NA NA  4 

這也可以寫成:

with(DF, tapply(y, data.frame(p, location), c)) 
+0

我更喜歡這個,因爲它不需要安裝包,但是當我運行這個時,我得到ABCD作爲列標題,而站點1-3作爲第一列中的行。因爲你用來交易的代碼不是很直觀 - 我不知道如何根據這裏的內容重寫上面的命令 - 它對我的目的沒有用處。 – colin

+0

我已經重寫了查詢,給行,而不是列的A,B,C,D,添加了一些解釋和替代'tapply'表達式。 –