如何使用dplyr创建每月总计?

时间:2016-03-12 01:40:16

标签: r dplyr

我有一个包含大量变量的数据框。子集:

ID month val   tt 
a  Jan   3    0.76
a  Jan   4    0.65
a  Feb   5    0.67
b  Mar   23   0.25
b  Apr   3    0.25
c  Jan   5    0.22
d  Aug   5    0.44
c  Sep   7    0.21
e  Oct   3    0.77

我想知道每个ID每月发生多少次。

预期的解决方案(插图,与给定的数据帧不符):

ID  Jan Feb Mar Apr May Jun etc.
a   20  25  51
b   4   65  54
c   14  11  44
d   78  44  41

目前,我在为每个ID进行子集化数据后使用table命令以非常粗略的方式进行此操作。并希望使用dplyr。

df %>%
  group_by(month) %>%
  summarise(count=n())

不确定如何继续。

1 个答案:

答案 0 :(得分:0)

这是您的一个选择。我将month视为角色。我创建了一个主数据框,每个ID包含12个月。然后,我使用了count()。这样,您就不必使用group_by()summarize()。将主数据帧与其他数据帧合并。我使用spread()将结果转换为宽格式。最后,我使用select()match()中重新排序了几个月。

library(dplyr)
library(tidyr)

master <- expand.grid(ID = unique(mydf$ID), month = month.abb, stringsAsFactors = FALSE)

count(mydf, ID, month) %>%
full_join(master) %>% # or right_join(master) %>%
spread(key = month, value = n, fill = 0) %>%
select(ID, match(month.abb, names(temp)))

#     ID   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
#  (chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
#1     a     2     1     0     0     0     0     0     0     0     0     0     0
#2     b     0     0     1     1     0     0     0     0     0     0     0     0
#3     c     1     0     0     0     0     0     0     0     1     0     0     0
#4     d     0     0     0     0     0     0     0     1     0     0     0     0
#5     e     0     0     0     0     0     0     0     0     0     1     0     0

数据

mydf <- structure(list(ID = c("a", "a", "a", "b", "b", "c", "d", "c", 
"e"), month = c("Jan", "Jan", "Feb", "Mar", "Apr", "Jan", "Aug", 
"Sep", "Oct"), val = c(3L, 4L, 5L, 23L, 3L, 5L, 5L, 7L, 3L), 
tt = c(0.76, 0.65, 0.67, 0.25, 0.25, 0.22, 0.44, 0.21, 0.77
)), .Names = c("ID", "month", "val", "tt"), class = "data.frame", row.names = c(NA, 
-9L))