【问题标题】:Ranking within each group各组内排名
【发布时间】:2017-03-15 12:43:26
【问题描述】:

考虑数据:

set.seed(123)

x <- rbinom(12, 1, .5)  
y <- (x==0) * rexp(12, 1/100)
z <- (x==1) * rexp(12, 1/220)
group <- sample( rep(1:2, each=6) )

d <- data.frame(x, y, z, group)

数据先按y排序,再按z排序

d <- d[order(d$y,d$z),]

现在在每个组中,我想给 rank 。以下代码正常工作:

ds <- split(d, d$group)

ds1 <- ds[[1]]
ds1$rank <- 1:nrow(ds1)

ds2 <- ds[[2]]
ds2$rank <- 1:nrow(ds2)

但在不拆分数据框的情况下,我想在每个组中进行排名。我该怎么做?

【问题讨论】:

    标签: r


    【解决方案1】:

    dplyr方式:

    library(dplyr)
    d %>% 
        arrange(group, y, z) %>% 
        group_by(group) %>% 
        mutate(rank = 1:n()) %>% 
        ungroup()
    

    我们首先按group 对data.frame 排序,然后按yz,然后按group 对其进行分组,然后为每个观察分配排名。

    结果:

    # A tibble: 12 × 5
           x         y          z group  rank
       <int>     <dbl>      <dbl> <int> <int>
    1      1   0.00000   6.988904     1     1
    2      1   0.00000 329.283431     1     2
    3      1   0.00000 353.287515     1     3
    4      0  35.51413   0.000000     1     4
    5      0  47.87604   0.000000     1     5
    6      0 272.62365   0.000000     1     6
    7      1   0.00000 212.491666     2     1
    8      1   0.00000 257.076377     2     2
    9      1   0.00000 326.760675     2     3
    10     1   0.00000 889.022577     2     4
    11     0  48.02147   0.000000     2     5
    12     0  84.97861   0.000000     2     6
    

    【讨论】:

    • 但它没有对 z 值进行排序。
    • 我已经修改了答案。
    • data.table 翻译 - d[order(group,y,z), seq_len(.N), by=group]
    【解决方案2】:

    这是一个使用base R 的选项。我们首先order基于'group'、'y'、'z'列的数据集,然后使用ave通过'group'创建序列

    d1 <- d[do.call(order, d[c("group", "y", "z")]),]
    row.names(d1) <- NULL
    d1$rank <- with(d1, ave(seq_along(group), group, FUN = seq_along))
    d1
    #   x         y          z group rank
    #1  1   0.00000   6.988904     1    1
    #2  1   0.00000 329.283431     1    2
    #3  1   0.00000 353.287515     1    3
    #4  0  35.51413   0.000000     1    4
    #5  0  47.87604   0.000000     1    5
    #6  0 272.62365   0.000000     1    6
    #7  1   0.00000 212.491666     2    1
    #8  1   0.00000 257.076377     2    2
    #9  1   0.00000 326.760675     2    3
    #10 1   0.00000 889.022577     2    4
    #11 0  48.02147   0.000000     2    5
    #12 0  84.97861   0.000000     2    6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多