Подтвердить что ты не робот

Получите отчетность dplyr отчетливо

Я новичок в dplyr, Мне нужно вычислить различные значения в группе. Вот пример таблицы:

data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c'))

Я знаю, что могу делать такие вещи, как:

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))

Но если я хочу подсчет уникальных элементов?

Я могу сделать:

  > summarise(by_bb,length(unique(unlist(aa))))

  bb length(unique(unlist(aa)))
1  a                          2
2  b                          1
3  c                          2

и если я хочу исключить NAs, я делаю:

> summarise(by_bb,length(unique(unlist(aa[!is.na(aa)]))))

  bb length(unique(unlist(aa[!is.na(aa)])))
1  a                                      2
2  b                                      1
3  c                                      1

Но это немного нечитаемо для меня. Есть ли лучший способ сделать такое обобщение?

4b9b3361

Ответ 1

Как насчет этой опции:

data %>%                    # take the data.frame "data"
  filter(!is.na(aa)) %>%    # Using "data", filter out all rows with NAs in aa 
  group_by(bb) %>%          # Then, with the filtered data, group it by "bb"
  summarise(Unique_Elements = n_distinct(aa))   # Now summarise with unique elements per group

#Source: local data frame [3 x 2]
#
#  bb Unique_Elements
#1  a               2
#2  b               1
#3  c               1

Используйте filter для фильтрации любых строк, где aa имеет NA, затем группируйте данные по столбцу bb, а затем суммируйте, подсчитав количество уникальных элементов столбца aa группой bb.

Как вы можете видеть, я использую оператор трубы %>%, который вы можете использовать для команд "pipe" или "chain" вместе при использовании dplyr. Это поможет вам написать легко читаемый код, потому что он более естественный, например. вы пишете код слева для записи и сверху вниз и не глубоко вложен изнутри (как в вашем примере кода).

Edit:

В первой части вашего вопроса вы написали:

Я знаю, что могу делать такие вещи, как:

by_bb<-group_by(data, bb, add = TRUE)
summarise(by_bb, mean(aa, na.rm=TRUE), max(aa), sum(!is.na(aa)), length(aa))

Вот еще одна возможность сделать это (применив несколько функций к одному столбцу (столбцам)):

data %>%
  filter(!is.na(aa)) %>%
  group_by(bb) %>%
  summarise_each(funs(mean, max, sum, n_distinct), aa)

#Source: local data frame [3 x 5]
#
#  bb mean max sum n_distinct
#1  a    2   3   4          2
#2  b    2   2   2          1
#3  c    4   4   4          1