Подсчитать объем дат и метки - PullRequest
1 голос
/ 09 февраля 2020

Имея такие данные:

data.frame(class = c("a","b","a","a"), date = c(2010,2009,2010,2009))

Как можно иметь выходные данные, которые подсчитывают, сколько раз значение существует в столбце класса за указанные c года (столбец даты) и имеет его объем. Пример ожидаемого результата

class date volume
a      2009  1
b      2009  1
a      2010  2
b      2010  0

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020
df <-data.frame(class = c("a","b","a","a"), date = c(2010,2009,2010,2009))

Решение с использованием базы R:

  table(df$class, df$date)

Возвращает:

  2009 2010
a    1    2
b    1    0

Решение с использованием dplyr:

library(dplyr)
df %>% 
  mutate(date = as.factor(date)) %>% 
  group_by(class, date, .drop=FALSE) %>% 
  summarise(N = n())

Возвращает:

# A tibble: 4 x 3
# Groups:   class [2]
  class date      N
  <fct> <fct> <int>
1 a     2009      1
2 a     2010      2
3 b     2009      1
4 b     2010      0

С dplyr мы должны убедиться, что обе группирующие переменные являются факторами, и что мы используем параметр .drop=FALSE. Таким образом, пустые группы не отбрасываются.

1 голос
/ 09 февраля 2020

Используйте библиотеку reshape2. Если вам не важна форма вывода, вы можете просто остановиться на dcast ниже. Если вы хотите вывод, как вы указали, вам нужно снова запустить melt, чтобы получить правильный формат:

library(reshape2)
x <- data.frame(class = c("a","b","a","a"), date = c(2010,2009,2010,2009))
y <- dcast(x, class~date, fun.aggregate = length)
melt(y, id.vars='class', variable.name='volume')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...