Добавление меток к данным с помощью ddply во время поднабора - PullRequest
3 голосов
/ 31 июля 2010

Допустим, у меня есть data.frame вроде:

x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10)
df <- data.frame(x=x,y=rnorm(100))

, и я хочу пометить значения, которые отсортированы (по убыванию) в 80-м процентиле для каждого значения x (1:10).Я могу получить квантили и упорядочить данные без проблем, например:

df <- ddply(df, .(x), subset, y > quantile(y,0.8))
df <- df[with(df, order(x,-y)),]

Теперь, как я могу получить ddply, чтобы добавить столбец меток (1,2,3, ... n) вновый столбец data.frame для каждого отсортированного подмножества?Теперь я могу сделать это с помощью цикла for, считая nrow (df ["x"]), но в этом, похоже, отсутствует чувство красноречия.

Примечание. Этот вопрос является сборкой и связан с: Создание нескольких подмножеств в одном файле данных (возможно, с помощью ddply)

Ответы [ 2 ]

6 голосов
/ 31 июля 2010
df <- ddply(df, "x", transform, id = rank(y))

Или, если уже отсортированы:

df <- ddply(df, "x", transform, id = seq_along(y))
1 голос
/ 31 июля 2010

Может быть, эта функция выдает то, что вы хотите:

subno <- function(df, vars, offset=1) {
    id <- do.call("paste", df[,vars, drop=FALSE])
    nr <- seq(along.with=id)
    grpnr <- nr
    grpnr[c(FALSE, id[-1] == id[-length(id)])] <- 0
    subnr <- nr - cummax(grpnr) + offset
    return(subnr)
}

df$label <- subno(df, c('x'))

Эта функция ожидает отсортированный фрейм данных, а vars содержит имена переменных, по которым нужно сгруппировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...