2012-05-03 2 views
1

Я хотел бы определить случай группами, которые просто больше, чем avg plus sd. Например, использование видов как группы и petal.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

Спасибо вам за помощь, но это то, что я пытаюсь выяснить , Просто большее значение. –