How to group_by(x) and summarise by counting distinct(y) for each x level?

I have the following situation:

V1 V2
A A1
A A1
A A1
A A2
A A2
A A3
B B1
B B2
B B2

and i need to group by V1, and summarise counting how many distinct groups each V1 level has in V2. Something like this:

V1 n
A 3
B 2

How can i use dplyr funcitons to solve that?

Thanks!!

>Solution :

We can use rle after grouping by ‘V1’

library(dplyr)
df1 %>%
   group_by(V1) %>%
   summarise(n = length(rle(V2)$values), .groups = 'drop')

-output

# A tibble: 2 × 2
  V1        n
  <chr> <int>
1 A         3
2 B         2

Or with rleid and n_distinct

library(data.table)
df1 %>% 
  group_by(V1) %>% 
  summarise(n = n_distinct(rleid(V2)))
# A tibble: 2 × 2
  V1        n
  <chr> <int>
1 A         3
2 B         2

data

df1 <- structure(list(V1 = c("A", "A", "A", "A", "A", "A", "B", "B", 
"B"), V2 = c("A1", "A1", "A1", "A2", "A2", "A1", "B1", "B2", 
"B2")), class = "data.frame", row.names = c(NA, -9L))

Leave a Reply