Количество вхождений фактора в 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