2012-05-03 31 views
1

我想通過比avg plus sd更大的組來識別案例。例如,使用物種作爲組和花瓣.wid作爲虹膜數據中的變量。通過data.frame中的組識別案例

什麼是更好的方法來做?創建一個函數?

我做到了這一點,但是我無法與原始數據建立關係以識別案例。

data(iris) 
library(plyr) 
petal.wid.avg <- ddply(iris, .(Species), function(df) 
    return(c(petal.wid.avg=mean(df$Petal.Width), petal.wid.sd=sd(df$Petal.Width))) 
) 
petal.wid.avg$avgsd <- petal.wid.avg$petal.wid.avg + petal.wid.avg$petal.wid.sd 
petal.wid.avg 
+0

您的示例不可重現。我改變了它。現在它是。 – Andrie

+0

我還不清楚你想要什麼。你能提供一些你期望的例子嗎? – Dason

回答

4

有很多方法可以做到這一點,但ave函數也許是最簡單的。

iris$big <- with(iris, 
    ave(Petal.Width, Species, FUN = function(x) x > mean(x) + sd(x)) 
) 

這裏的plyr解決方案:

iris <- ddply(
    datasets::iris, 
    .(Species), 
    transform, 
    big = Petal.Width > mean(Petal.Width) + sd(Petal.Width) 
) 

Baed上的評論,這裏是解決方案的其餘部分。

iris <- subset(iris, big) 
iris <- ddply(
    iris, 
    .(Species), 
    transform, 
    smallest = Petal.Width == min(Petal.Width) 
) 
(iris <- subset(iris, smallest)) 

請注意,如果您有關係(如在此數據集中),則不會得到唯一的「更大」行。

+0

我的解釋是您已經複製了問題中的代碼。現在的問題是要確定每個物種的單個元素*只是*大於分界點(即大於平均值+ sd) – Andrie

+0

謝謝你們兩位的幫助,但這正是我想弄明白的。只是更大的價值。 –