R - После группировки, как получить максимальное количество повторений значения? - PullRequest
0 голосов
/ 04 декабря 2018

Скажем, у меня есть такой набор данных:

 id <- c(1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
 foo <- c('a', 'b', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'a', 'a')
 dat <- data.frame(id, foo)

Т.е.,

    id  foo
 1   1   a
 2   1   b 
 3   2   a
 4   2   a
 5   2   b
 6   2   b
 7   2   b
 8   3   c
 9   3   c
10   3   a
11   3   a

Для каждого идентификатора, как я могу получить максимальное повторение значений foo

Т.е.,

   id  max_repeat
1   1   1
2   2   3
3   3   2

Например, id 2 имеет max_repeat 3, потому что одно из его значений foo (b) повторяется 3 раза.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

dplyr

library(tidyverse)

dat %>% 
  group_by(id) %>% 
  summarise(max_repeat = max(tabulate(foo)))

# # A tibble: 3 x 2
#      id max_repeat
#   <dbl>      <int>
# 1     1          1
# 2     2          3
# 3     3          2

data.table

library(data.table)
setDT(dat)

dat[, .(max_repeat = max(tabulate(foo))), by = id]

#    id max_repeat
# 1:  1          1
# 2:  2          3
# 3:  3          2

base (можно использовать setNames для изменения имени при необходимости)

aggregate(foo ~ id, dat, function(x) max(tabulate(x)))
#   id foo
# 1  1   1
# 2  2   3
# 3  3   2
0 голосов
/ 04 декабря 2018

Без пакетов вы можете объединить два aggregate() s, один с длиной и один с максимумом.

x1 <- with(dat, aggregate(list(count=id), list(id=id, foo=foo), FUN=length))
x2 <- with(x1, aggregate(list(max_repeat=count), list(id=id), FUN=max))

Выход:

> x2
  id max_repeat
1  1          1
2  2          3
3  3          2

Данные:

dat <- structure(list(id = c(1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3), foo = structure(c(1L, 
2L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 1L, 1L), .Label = c("a", "b", 
"c"), class = "factor")), class = "data.frame", row.names = c(NA, 
-11L))
0 голосов
/ 04 декабря 2018

Использование tidyverse:

dat %>%
 group_by(id, foo) %>% #Grouping by id and foo
 tally() %>% #Calculating the count
 group_by(id) %>%
 summarise(res = max(n)) #Keeping the max count per id

     id   res
  <dbl> <dbl>
1    1.    1.
2    2.    3.
3    3.    2.
...