2013-07-19 27 views
6

我有一個包含產品原型測試數據的數據集。並非所有測試都在所有批次上運行,並且並非所有測試都以相同的樣本大小執行。爲了說明這一點,考慮這種情況下:使用聚合的na.omit和na.pass的混合?

> test <- data.frame(name = rep(c("A", "B", "C"), each = 4), 
    var1 = rep(c(1:3, NA), 3), 
    var2 = 1:12, 
    var3 = c(rep(NA, 4), 1:8)) 

> test 
    name var1 var2 var3 
1  A 1 1 NA 
2  A 2 2 NA 
3  A 3 3 NA 
4  A NA 4 NA 
5  B 1 5 1 
6  B 2 6 2 
7  B 3 7 3 
8  B NA 8 4 
9  C 1 9 5 
10 C 2 10 6 
11 C 3 11 7 
12 C NA 12 8 

在過去,我只不得不處理不匹配的重複,這一直是容易aggregate(cbind(var1, var2) ~ name, test, FUN = mean, na.action = na.omit)(或默認設置)的情況下。對於var1,我會得到每個批次的平均值超過三個值,以及對於var2超過四個值。

不幸的是,這將讓我完全缺失的數據集很多A在這種情況下:

aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.omit) 
    name var1 var2 var3 
1 B 2 6 2 
2 C 2 10 6 

如果我使用na.pass,不過,我還沒有得到我想要的:

aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.pass) 
    name var1 var2 var3 
1 A NA 2.5 NA 
2 B NA 6.5 2.5 
3 C NA 10.5 6.5 

現在我失去了我在var1中的良好數據,因爲它包含NA的實例。

我想的是:

  • NA作爲的varNnameNA小號
  • mean()輸出,如果有一個以上的實際值mean()如果所有獨特組合改變輸出爲varNname

我猜這是預先tty簡單,但我只是不知道如何。我是否需要使用ddply這樣的東西?如果是這樣的......我傾向於避免它的原因是,我寫出來很長等同aggregate()像這樣:

ddply(test, .(name), summarise, 
    var1 = mean(var1, na.rm = T), 
    var2 = mean(var2, na.rm = T), 
    var3 = mean(var3, na.rm = T)) 

呀......所以這個結果顯然我想要做什麼。無論如何我都會留下問題,以防1)aggregate()或2)ddply更短的語法。

+0

重新絆倒在一個答案重新。 'ddply' [這裏](http://stackoverflow.com/questions/10787640/r-ddply-summarize-with-large-number-of-columns)。基本上,融化數據框架,根據感興趣的變量和前一個列名稱的組合應用'mean()',然後將其轉換回原始形狀。任何其他? – Hendy

回答

16

通過na.action=na.passna.rm=TRUEaggregate。前者告訴aggregate不要刪除NAs存在的行;後者告訴mean忽略它們。

aggregate(cbind(var1, var2, var3) ~ name, test, mean, 
      na.action=na.pass, na.rm=TRUE) 
+0

太棒了,我不知道這是可能的。 – Hendy

+0

@HongOoi這很棒。只需注意一點,這將取決於您選擇的功能取決於零的NAs。這很可能不是你想要的最終結果,所以只需確保跟隨'df [df == 0] < - NA'之類的東西。如果你的df中有真正的零,你不想刪除,那麼把上面的代碼和'is.na(df)' –

+0

組合起來,這會返回'NaN',而不是'NA'作爲名字'A', 'var3' – colin