在子集化时使用ddply向数据添加标签

时间:2010-07-31 00:15:04

标签: r

假设我有一个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))

我希望为每个x值(1:10)标记在第80百分位数中排序(降序)的值。我可以得到分位数并订购数据,没有这样的问题:

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

现在,我怎样才能让ddply在每个已排序子集的data.frame的新列中添加一列标签(1,2,3,... n)?我现在可以通过计算nrow(df [“x”])的for循环来做到这一点,但这似乎缺乏任何口才感。

注意:此问题是与Creating multiple subsets all in one data.frame (possibly with ddply)

建立起来并与之相关的问题

2 个答案:

答案 0 :(得分:6)

df <- ddply(df, "x", transform, id = rank(y))

或者,如果已经排序:

df <- ddply(df, "x", transform, id = seq_along(y))

答案 1 :(得分:1)

也许这个功能可以产生你想要的东西:

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包含要分组的变量名称。