2015-05-21 86 views
1

对于数据:滤镜功能

Id res 
    1  9 
    1  8 
    1  8 
    1  6 
    1  5 
    1  4 
    2  6 
    2  6 
    2  0 
    2  0 
    2  0 
    2  0 

我想前四名各组。 当我使用

dat %>% group_by(Id) %>% 
     top_n(4,res) 

我得到

Id res 
1  9 
1  8 
1  8 
1  6 
2  6 
2  6 
2  0 
2  0 
2  0 
2  0 

这里需要的过滤器的方法。这将是一个适当的过滤器逻辑,以便我只得到前四行(允许关系)

回答

5

据我所知top_n如果关系返回更多行。

也许这有帮助吗?

dat %>% group_by(Id) %>% arrange(desc(res)) %>% filter(row_number()<=4) 

    Id res 
1 1 9 
2 1 8 
3 1 8 
4 1 6 
5 2 6 
6 2 6 
7 2 0 
8 2 0 
1

你也可以简单地使用head,这里data.table包:

library(data.table) 
setDT(df)[, head(res,4), Id] 

或按@Jack惠勒正确地强调:

setDT(df)[, .SD[1:4], by = Id] 
+1

你也可以做到这一点使用.SD这是data.table的一部分'setDT(df)[,.SD [1:4],by = Id]' – JWheeler

+0

确实,这是个好主意! –

+0

它主要取决于数据中是否有更多的列,因为'.SD'效率不高。 –