在R中的每个因子内排序值

时间:2014-10-07 16:44:36

标签: r

我一直有这个问题并且一直在使用耗时的方法来做到这一点。我知道必须有更好的方法来做到这一点。假设我有以下数据:

set.seed(123)
group <- c(rep("a",3),rep("b",3),rep("c",3))
score <- runif(9)
score.2 <- rnorm(9)
df <- data.frame(group,score,score.2)

df

  group     score    score.2
1     a 0.2875775 -0.1089660
2     a 0.7883051 -0.1172420
3     a 0.4089769  0.1830826
4     b 0.8830174  1.2805549
5     b 0.9404673 -1.7272706
6     b 0.0455565  1.6901844
7     c 0.5281055  0.5038124
8     c 0.8924190  2.5283366
9     c 0.5514350  0.5490967

我想要的是类似的数据,但每个因子或字符列只有score的前两个值(如果组是因子类或字符类,可能会有所不同?),但我也想要{{1保留在数据中。所以最终输出应该只有6行数据。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

如果有人再使用base r,这是一个基本解决方案

set.seed(123)
group <- c(rep("a",3),rep("b",3),rep("c",3))
score <- runif(9)
score.2 <- rnorm(9)
df <- data.frame(group,score,score.2)

do.call(rbind, 
        by(df, df$group, function(x) 
          x[head(order(x$score, decreasing = TRUE), 2), ]))

#     group     score    score.2
# a.2     a 0.7883051 -0.1172420
# a.3     a 0.4089769  0.1830826
# b.5     b 0.9404673 -1.7272706
# b.4     b 0.8830174  1.2805549
# c.8     c 0.8924190  2.5283366
# c.9     c 0.5514350  0.5490967

答案 1 :(得分:2)

一个选项是来自slice devel版本

dplyr 0.3
 library(dplyr)
 df%>%
     group_by(group)%>%
     arrange(desc(score))%>%
     slice(1:2) #or 
    # do(head(., 2)) # in `dplyr 0.2` 
 #   Source: local data frame [6 x 2]
 #Groups: group

 # group     score    score.2
 #1     a 0.7883051 -0.1172420
 #2     a 0.4089769  0.1830826
 #3     b 0.9404673 -1.7272706
 #4     b 0.8830174  1.2805549
 #5     c 0.8924190  2.5283366
 #6     c 0.5514350  0.5490967

使用data.table

 library(data.table)
 setDT(df)[order(group, -score), head(.SD,2), by=group]
 #     group     score    score.2
 #1:     a 0.7883051 -0.1172420
 #2:     a 0.4089769  0.1830826
 #3:     b 0.9404673 -1.7272706
 #4:     b 0.8830174  1.2805549
 #5:     c 0.8924190  2.5283366
 #6:     c 0.5514350  0.5490967