Как получить глобальный индекс при использовании ddply? - PullRequest
1 голос
/ 09 июля 2011

Я пытаюсь найти лучшее предложение с точки зрения цены / карата из набора данных Diamonds из пакета plyr

Так что я делаю

    new = ddply(diamonds, c("cut", "color", "clarity"), transform, ecart= price/carat -  mean(price/carat))   
    best = ddply(new, c("cut", "color", "clarity"), summarize, which(ecart == min(ecart))

Нокогда я делаю это, я получаю

    head(best)
    cut color clarity ..1  
    1 Fair     D      I1   4  
    2 Fair     D     SI2  49  
    3 Fair     D     SI1  39  
    4 Fair     D     VS2   9  
    5 Fair     D     VS1   2

Таким образом, кажется, что индекс берется из подгрупп, создаваемых ddply.Здесь только первый индекс 4 соответствует глобальному индексу.если я найду новый [2,], например, он не относится к типу Fair, D, VS1.

Есть идеи, как легко получить позицию глобального индекса?

Как быВы, например, добавить элегантно столбец id?Есть ли лучшее решение?

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

Если вы пытаетесь идентифицировать алмаз с самым низким значением ecart для каждой уникальной комбинации cut, color и clarity, то, возможно, вы хотели сделать что-то вроде этого:

new <- ddply(diamonds, c("cut", "color", "clarity"), transform, 
         ecart= price/carat -  mean(price/carat))   
best <- ddply(new, c("cut", "color", "clarity"), 
         .fun = function(x){x[which.min(x$ecart),]})

, который не требует работы с индексами вне каждого фрагмента diamonds, переданного в .fun.

EDIT

Хэдли указывает в комментариях, что

ddply(new, c("cut","color","clarity"), subset, ecart == min(ecart))

более элегантно. Он также будет правильно вытягивать все строки, которые соответствуют условию в случае минимальных связей.

2 голосов
/ 10 июля 2011

Кажется, я правильно понял, что вы хотели. Вы можете использовать функцию which.min напрямую для индексации в data.frames, которые возвращаются ddply. Вам просто нужно использовать анонимную функцию для этого:

ddply(new, c("cut", "color", "clarity"), function(x) x[which.min(x$ecart) ,])

Что касается вашего второго вопроса, вы можете сгенерировать столбец идентификаторов, например так:

diamonds$id <- seq_len(nrow(diamonds))

хотя я не уверен, как это связано с проблемой?

...