2012-08-04 21 views
1

我使用了以下(樣本)數據和交叉表()來創建交叉表數據集。當我使用這種方法時,沒有數據的所有列x行組合在我的輸出數據集中變爲零。我希望它們是NAs,因爲數據集中存在真正的零值,所以我無法區分它們。此外,我已經用xtabs()進行了實驗並獲得了相同的問題。非常感謝您獲得新手或其他方法的任何建議。交叉表和xtabs生成零而不是NAs

WW1_Data <- structure(list(Site_Name = c("Alnön", "Alnön", "Alnön", "Ammarnäs", 
"Ammarnäs", "Anjan", "Anjan", "Bäcksand", "Bäcksand", "Fittjebodarna", 
"Fittjebodarna", "Flatruet", "Flatruet", "Flatruet", "Flatruet", 
"Glen", "Glen", "Glen", "Idre", "Idre"), Year = c("1996", "2000", 
"2010", "1996", "2011", "2009", "2010", "2000", "2010", "2008", 
"2009", "2008", "2009", "2010", "2011", "2008", "2009", "2010", 
"1996", "2010"), WW1_Pct_2 = c(0.307692307692308, 0.260869565217391, 
0.0833333333333333, 0.75, 0.8, 0.52, 0.5, 0.0833333333333333, 
0.375, 0.4, 0.423076923076923, 0.85, 0.483870967741935, 0.56, 
0.58, 0.777777777777778, 0.555555555555556, 0.521739130434783, 
0.4, 0)), .Names = c("Site_Name", "Year", "WW1_Pct_2"), row.names = c(3L, 
4L, 5L, 8L, 9L, 10L, 11L, 15L, 16L, 28L, 29L, 30L, 31L, 32L, 
33L, 42L, 43L, 44L, 59L, 60L), class = "data.frame") 

xtabs(WW1_Pct_2 ~ Site_Name + Year, WW1_Data) 

## alternatively ## 

library(ecodist) 
WW1_XTAB <- data.frame(with(WW1_Data, crosstab(Site_Name, Year, WW1_Pct_2))) 

回答

2

由於當你與XTABS聚合所使用的函數是sum可以用na.rm的默認設置使用它通過使用tapply = FALSE:

> with(WW1_Data, tapply(WW1_Pct_2, list(Site_Name, Year), sum) ) 
         1996   2000   2008   2009   2010 2011 
Alnön   0.3076923077 0.26086956522   NA   NA 0.08333333333 NA 
Ammarnäs  0.7500000000   NA   NA   NA   NA 0.80 
Anjan     NA   NA   NA 0.5200000000 0.50000000000 NA 
Bäcksand    NA 0.08333333333   NA   NA 0.37500000000 NA 
Fittjebodarna   NA   NA 0.4000000000 0.4230769231   NA NA 
Flatruet    NA   NA 0.8500000000 0.4838709677 0.56000000000 0.58 
Glen     NA   NA 0.7777777778 0.5555555556 0.52173913043 NA 
Idre   0.4000000000   NA   NA   NA 0.00000000000 NA 

有用於as.data.frame方法表(這是一種特殊的矩陣),它是tapply返回的對象類。您使用as.data.frame是多餘的,因爲reshape的結果已經是一個數據幀。

1

這樣做的伎倆。歡迎其他解決方案

WW1_XTAB <- as.data.frame(reshape(WW1_Data,idvar="Site_Name",timevar="Year",direction="wide")) 
0

另一種方法是

library(reshape2) 
dcast(WW1_Data, Site_Name~Year) 

雖然這依賴於那裏只有每個站點/年組合的一個條目。如果有更多,你可以使用

library(reshape2) 
dcast(WW1_Data, Site_Name~Year, sum) 

但這會給0,而不是NA那裏有遺漏值(其依據是零個元素列表的總和爲0