Количество вхождений фактора в R, с указанием количества нулей

Я хочу подсчитать количество вхождений фактора в кадре данных. Например, чтобы подсчитать количество событий данного типа в следующем коде:

library(plyr)
events <- data.frame(type = c('A', 'A', 'B'),
                       quantity = c(1, 2, 1))
ddply(events, .(type), summarise, quantity = sum(quantity))

Вывод следующий:

     type quantity
1    A        3
2    B        1

Однако, что, если я знаю, что существуют три типа событий A, B и C, а также я хочу увидеть счетчик для C, который равен 0? Другими словами, я хочу, чтобы результат был следующим:

     type quantity
1    A        3
2    B        1
3    C        0

Как мне это сделать? Похоже, что должна быть определенная функция, чтобы сделать это где-то.

Ниже приведены мои две не очень хорошие идеи о том, как это сделать.

Идея № 1: Я знаю, что могу сделать это, используя цикл for, но я знаю, что широко говорят, что если вы используете цикл for в R, то вы делаете что-то неправильно, должен быть лучший способ сделать это.

Идея № 2: Добавить фиктивные записи в исходный фрейм данных. Это решение работает, но кажется, что должно быть более элегантное решение.

events <- data.frame(type = c('A', 'A', 'B'),
                       quantity = c(1, 2, 1))
events <- rbind(events, data.frame(type = 'C', quantity = 0))
ddply(events, .(type), summarise, quantity = sum(quantity))

Ответ 1

Вы получите это бесплатно, если вы правильно определяете свою переменную events в качестве фактора с требуемыми тремя уровнями:

R> events <- data.frame(type = factor(c('A', 'A', 'B'), c('A','B','C')), 
+                       quantity = c(1, 2, 1))
R> events
  type quantity
1    A        1
2    A        2
3    B        1
R> table(events$type)

A B C 
2 1 0 
R> 

Просто вызов table() по коэффициенту уже делает правильную вещь, а ddply() тоже может если вы скажете это не drop:

R> ddply(events, .(type), summarise, quantity = sum(quantity), .drop=FALSE)
  type quantity
1    A        3
2    B        1
3    C        0
R> 

Ответ 2

> xtabs(quantity~type, events)
type
A B C 
3 1 0 

Ответ 3

Использование библиотеки dplyr

library(dplyr)
data <- data.frame(level = c('A', 'A', 'B', 'B', 'B', 'C'),
                   value = c(1:6))

data %>%
  group_by(level) %>%
  summarize(count = n()) %>%
  View

Если вы выберете также выполнение средних, минимальных, максимальных операций, попробуйте это

data %>%
  group_by(level) %>%
  summarise(count = n(), Max_val = max(value), Min_val = min(value)) %>%
  View

Ответ 4

Совсем похоже на ответ @DWin:

> aggregate(quantity~type, events, FUN=sum)
  type quantity
1    A        3
2    B        1
3    C        0