我在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()
但是,它没有给我什么意图。
答案 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)
答案 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
合并。