【问题标题】:How to Create a Column of Ranks While Grouping in R如何在 R 中分组时创建一列排名
【发布时间】:2012-09-11 20:29:22
【问题描述】:

我正在使用 R,我想创建一个显示序列或排名的列,同时按两个因素(hhid 和句点)分组。

例如,我有这个数据集:

hhid perid
1000 1     
1000 1
1000 1
1000 2
1000 2
2000 1
2000 1
2000 1
2000 1
2000 2
2000 2

我想像这样添加一个名为“actno”的列:

hhid perid actno
1000 1     1
1000 1     2
1000 1     3
1000 2     1
1000 2     2
2000 1     1
2000 1     2
2000 1     3
2000 1     4
2000 2     1
2000 2     2

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您有很多组或大量数据,data.table 是提高时间和内存效率的方法

    # assuming your data is in a data.frame called DF
    library(data.table)
    DT <- data.table(DF)
    
    
    DT[, ActNo := seq_len(.N), by = list(hhid,perid)]
    

    请注意,.N 通过分组给出子集中的行数(有关详细信息,请参阅?data.table

    【讨论】:

    • 有没有快速处理 data.table 中的关系的方法?
    【解决方案2】:

    不需要 plyr。只需使用aveseq

    > dat$actno <- with( dat, ave(hhid, hhid, perid, FUN=seq))
    > dat
       hhid perid actno
    1  1000     1     1
    2  1000     1     2
    3  1000     1     3
    4  1000     2     1
    5  1000     2     2
    6  2000     1     1
    7  2000     1     2
    8  2000     1     3
    9  2000     1     4
    10 2000     2     1
    11 2000     2     2
    

    此实例中的第一个参数可以是列,或者您可以使用稍微不那么优雅的 bu 来做,也许更清楚:

    dat$actno <- with( dat, ave(hhid, hhid, perid, FUN=function(x) seq(length(x) ) ) )
    

    【讨论】:

      【解决方案3】:

      如果您的数据被称为urdat,那么没有plyr,您可以这样做:

      df <- urdat[order(urdat$hhid, urdat$perid),]
      df$actno <- sequence(rle(df$perid)$lengths)
      

      【讨论】:

        【解决方案4】:

        plyr 包可以很好地做到这一点:

        library(plyr)
        dat <- structure(list(hhid = c(1000L, 1000L, 1000L, 1000L, 1000L, 2000L, 
        2000L, 2000L, 2000L, 2000L, 2000L), perid = c(1L, 1L, 1L, 2L, 
        2L, 1L, 1L, 1L, 1L, 2L, 2L)), .Names = c("hhid", "perid"), class = "data.frame", row.names = c(NA, 
        -11L))
        
        ddply(dat, .(hhid, perid), transform, actno=seq_along(perid))
        
           hhid perid actno
        1  1000     1     1
        2  1000     1     2
        3  1000     1     3
        4  1000     2     1
        5  1000     2     2
        6  2000     1     1
        7  2000     1     2
        8  2000     1     3
        9  2000     1     4
        10 2000     2     1
        11 2000     2     2
        

        【讨论】:

        • 非常感谢,贾斯汀...它适用于我的数据集,但由于组数众多,运行您的代码后需要很长时间,并且我的计算机速度明显变慢。你有什么建议吗?
        • @user1663986 plyr 是探索数据的好方法,只要它很小。其他任何一个答案,尤其是 DWin 的答案都将非常快并且在大数据上运行良好。
        • @user1663986 你是怎么理解 mnel 的回答的?
        【解决方案5】:

        伪代码:

        For each unique value of `hhid` `h`
            For each unique value of `perid` `p`
                counter = 0;
                For each row of table where `hhid==h && perid==p`
                    counter++;
                    Assign counter to `actno` of this column
        

        应该很容易实现,尤其是data frame

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-02
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          相关资源
          最近更新 更多