数据:
ID<-c(1,2,3,4,5,6,7,8)
Value<-c(5,4,7,2,6,3,9,4)
Group<-c(1,1,1,2,3,2,2,3)
data<-data.frame(ID,Value,Group)
I would like to take the 2 of every Group with the highest Values into a new DataFrame.
最终结果应如下所示: ID&LT; -1,3,6,7,5,8 值LT; -5,7,3,9,6,4 基团LT; -1,1,2,2,3,3 FinalData的&LT ;-( ID,价值,集团)
我的方法是:
Finaldata<-head(data[order(Value,decreasing=TRUE),],n=2)
但我遇到的问题包括它应该为每个群体做到这一点,而不仅仅是针对总体最高值。
答案 0 :(得分:4)
使用“data.table”,你可以尝试这样的事情:
library(data.table)
as.data.table(data)[order(Group, -Value), head(.SD, 2), by = Group]
# Group ID Value
# 1: 1 3 7
# 2: 1 1 5
# 3: 2 7 9
# 4: 2 6 3
# 5: 3 5 6
# 6: 3 8 4
答案 1 :(得分:1)
使用dplyr
。如果您使用dplyr_0.3
即。 devel版本slice
可用,否则,您可以使用do
。您可以通过以下方式安装devel版本:
devtools::install_github("hadley/dplyr") #first you need to install `devtools`.
另外,您可以查看链接https://github.com/hadley/dplyr
library(dplyr)
data%>%
group_by(Group) %>%
arrange(desc(Value)) %>%
slice(1:2) # do(head(.,2)) #in dplyr 0.2
给出结果
# ID Value Group
#1 3 7 1
#2 1 5 1
#3 7 9 2
#4 6 3 2
#5 5 6 3
#6 8 4 3
通过使用slice
,您可以获得每个组的第二个最高值(即slice(2)
),或者从数据集实际拥有的任何起始行到任何结束行。在此示例中,(slice(2:3)
为组1
提供了3
行,因为该组中只有2行。
或使用base R
data[with(data, ave(-Value, Group, FUN=rank)%in% 1:2),]
# ID Value Group
#1 1 5 1
#3 3 7 1
#5 5 6 3
#6 6 3 2
#7 7 9 2
#8 8 4 3
答案 2 :(得分:0)
尝试:
ll = lapply(split(data, Group), function(x) tail(x[order(x$Value),],2) )
ll
$`1`
ID Value Group
1 1 5 1
3 3 7 1
$`2`
ID Value Group
6 6 3 2
7 7 9 2
$`3`
ID Value Group
8 8 4 3
5 5 6 3
要绑定到数据框:
do.call(rbind, ll)
ID Value Group
1.1 1 5 1
1.3 3 7 1
2.6 6 3 2
2.7 7 9 2
3.8 8 4 3
3.5 5 6 3
或:
rbindlist(ll)
ID Value Group
1: 1 5 1
2: 3 7 1
3: 6 3 2
4: 7 9 2
5: 8 4 3
6: 5 6 3