我有一个包含大量变量的数据框。子集:
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())
不确定如何继续。
答案 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))