如何在dplyr中查找组中的前N个降序值

时间:2017-07-28 05:28:02

标签: r

我在R

中有以下数据框
  Serivce     Codes
   ABS         RT
   ABS         RT
   ABS         TY
   ABS         DR
   ABS         DR
   ABS         DR
   ABS         DR
   DEF         RT
   DEF         RT
   DEF         TY
   DEF         DR
   DEF         DR
   DEF         DR
   DEF         DR
   DEF         TY
   DEF         SE
   DEF         SE

我想要的是服务明智的代码按降序排列

  Serivce     Codes    Count
   ABS         DR        4
   ABS         RT        2 
   ABS         TY        1
   DEF         DR        4
   DEF         RT        2
   DEF         TY        2  

我在r

中做了以下事情
df%>% 
group_by(Service,Codes) %>% 
summarise(Count = n()) %>%
top_n(n=3,wt = Count) %>% 
arrange(desc(Count)) %>% 
as.data.frame()   

但是,它没有给我什么意图。

3 个答案:

答案 0 :(得分:5)

我们可以尝试count/arrange/slice

df1 %>% 
   count(Service, Codes) %>%
   arrange(desc(n)) %>% 
   group_by(Service) %>% 
   slice(seq_len(3))
# A tibble: 6 x 3
# Groups:   Service [2]
#  Service Codes     n
#    <chr> <chr> <int>
#1     ABS    DR     4
#2     ABS    RT     2
#3     ABS    TY     1
#4     DEF    DR     4
#5     DEF    RT     2
#6     DEF    SE     2

在OP的代码中,我们需要arrange通过&#39;服务&#39;太。正如@Marius在评论中所说,top_n如果存在联系,将包含更多行。一种选择是使用&#39; Service&#39;进行第二次分组。和slice(如上所示)或在分组后,我们可以filter

df1 %>% 
  group_by(Service,Codes) %>%
  summarise(Count = n()) %>%
  top_n(n=3,wt = Count)  %>%
  arrange(Service, desc(Count)) %>%
  group_by(Service) %>%
  filter(row_number() <=3)

答案 1 :(得分:1)

df%>%count(Service,Codes)%>%mutate(rank = density_rank(desc(n)))%>%filter(rank <5)

top_n()要返回的行数,就像row_number()

n是按服务分组的,则代码的计数类似于

答案 2 :(得分:0)

在基础R中,您可以分两行完成。

# get data.frame of counts by service-code pairs
mydf <- data.frame(table(dat))

# get top 3 by service
do.call(rbind, lapply(split(mydf, mydf$Serivce), function(x) x[order(-x$Freq)[1:3],]))

返回

      Serivce Codes Freq
ABS.1     ABS    DR    4
ABS.3     ABS    RT    2
ABS.7     ABS    TY    1
DEF.2     DEF    DR    4
DEF.4     DEF    RT    2
DEF.6     DEF    SE    2

在第一行中使用table来获取计数,然后转换为data.frame。在第二行中,按服务拆分,按order的负值排序,并拉出前三个元素。将结果与do.call合并。