Ответ 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