【问题标题】:How can I create a monthly total using dplyr?如何使用 dplyr 创建每月总计?
【发布时间】:2016-03-12 01:40:16
【问题描述】:

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

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())

不知道如何继续。

【问题讨论】:

  • 虽然我想更熟悉 dplyr 库,但您的解决方案是:ID month 1 1
  • ID 是字符。不确定它是否有影响。
  • 我想我用count函数得到了答案。
  • 我觉得奇怪的是有人在评论然后删除他们的 cmets。 :/ 除非我有什么问题。

标签: r dplyr


【解决方案1】:

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

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多