【问题标题】:Adding labels to data with ddply while subsetting在子集化时使用 ddply 向数据添加标签
【发布时间】:2010-07-31 00:15:04
【问题描述】:

假设我有一个像这样的 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) 建立并与之相关的

【问题讨论】:

  • 对不起,我不完全理解标签应该是什么。我也不确定向量上的 nrow() 是如何工作的。
  • 没关系,看到哈德利的回应

标签: r


【解决方案1】:
df <- ddply(df, "x", transform, id = rank(y))

或者,如果已经排序:

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

【讨论】:

    【解决方案2】:

    也许这个函数会产生你想要的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2016-05-31
      相关资源
      最近更新 更多