我一直有这个问题并且一直在使用耗时的方法来做到这一点。我知道必须有更好的方法来做到这一点。假设我有以下数据:
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行数据。任何人都可以帮助我吗?
答案 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