'Unable to choose top_n(100)

I need to choose the top 100 rows in descending order Original Table

route   member_casual  n
A       member         5 
A       casual        10
B       member        21
B       casual         9
C       member        30 
C       casual        5

Required Table

route  member_casual n
C      member        30
B      member        21
A      member         5
A      casual        10   
B      casual         9
C      casual         5

code that I have already tried:

df %>% group_by(route,member_casual) %>% count() %>% top_n(100)
df %>% group_by(route,member_casual) %>% count() %>% top_n(100, wt = "n")

The end goal is to make a geom_col to compare top 100 or 10 common routes between members and casual riders, with "n" on the x axis and "route" on y axis.

r


Solution 1:[1]

You need to set .by_group to TRUE:

dat <- structure(list(route = c("A", "A", "B", "B", "C", "C"), member_casual = c("member", 
"casual", "member", "casual", "member", "casual"), n = c(5L, 
10L, 21L, 9L, 30L, 5L)), class = "data.frame", row.names = c(NA, 
-6L))

dat |> group_by(member_casual)|> 
  arrange(desc(n), .by_group = TRUE) |> 
  arrange(desc(member_casual))

# A tibble: 6 × 3
# Groups:   member_casual [2]
#  route member_casual     n
#  <chr> <chr>         <int>
#1 C     member           30
#2 B     member           21
#3 A     member            5
#4 A     casual           10
#5 B     casual            9
#6 C     casual            5

Then, you can select top n from the result:

dat |> 
  group_by(member_casual)|> 
  arrange(desc(n), .by_group = TRUE) |> 
  arrange(desc(member_casual)) |> top_n(2)

Selecting by n
# A tibble: 4 × 3
# Groups:   member_casual [2]
  route member_casual     n
  <chr> <chr>         <int>
1 C     member           30
2 B     member           21
3 A     casual           10
4 B     casual            9

Note that top_n() has been superseded in favour of slice_min()/slice_max(), as @Limey has kindly pointed out in the comment. Hence, it's recommended to use slice_max() in this case.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1