2017-07-28 37 views
3

降組值我有R A下面的數據幀如何找到前N在dplyr

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() 

但是,它不給我什麼打算。

回答

4

我們可以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。正如@Marius在評論中所說,top_n將包含更多數量的行(如果存在關係)。一種選擇是,用做「服務」和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) 
+0

完美地工作。我只是想知道爲什麼我的方法不起作用? – Neil

+0

@Neil更新了帖子 – akrun

+0

謝謝,工作完美。 – Neil

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結合。