2012-04-02 79 views
1

我試圖使用reshape2包在我的數據集的頂部重新分配列。我在三個地點測量了兩次溫度和chl-a。但是,當我融化並投射數據框時,fun.aggregate默認爲長度。我想保留原始值。下面是一個例子的數據集:reshape2播數據幀值

library(reshape2) 
library(stringr) 
df=data.frame(site=rep(1:3,each=2),temp_2009=c(23,24,25,25,23,43),chla_2009=c(3,2,3,4,5,6), 
      temp_2010=c(23,25,26,27,23,23),chla_2010=c(2,3,5,6,2,1)) 
df2=melt(df,id.vars=1,measure.vars=c(2:5)) 
df2=cbind(df2,data.frame(str_split_fixed(df2$variable,"_",2))) 
df2=df2[,-2] 
names(df2)[3:4]=c("variable","year") 
dcast(df2,site+year~variable) 

我覺得這事做reshape2處理重複值的方式。

有什麼想法?

+0

一般來說,寫出來你認爲你data.frame應該像它的有用的 - 至少在第一排。 – 2012-04-02 16:17:37

回答

3

各行被聚集爲dcast基於所提供的公式不能區分它們。如果你想保持原始值,那麼你需要包含一個字段來唯一標識重複項。要繼續你的代碼...

df2$group <- rep(1:2,12) 
dcast(df2,site+year+group~variable) 

顯然,這代碼是一個有點簡單化(尤其是您的數據必須由「組」沒有缺失值排序),但它應該能夠說明如何保留原始值。

+0

看起來不錯,謝謝! – jslefche 2012-04-02 17:47:32

1

另一個選項試圖dcast熔融數據集重複值是讓dcast來計算平均值/中間/最小/最大(無論是最相關的根據您的情況),以「解析」重複。

dcast(df2, site+year~variable, fun.aggregate = mean) 

顯然是刪除(amalgamates)記錄 - 其中OP說是不可取的