子集R中每个组的最高值

时间:2014-10-06 17:12:59

标签: r subset

数据:

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) 

但我遇到的问题包括它应该为每个群体做到这一点,而不仅仅是针对总体最高值。

3 个答案:

答案 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