【问题标题】:Creating monthly total counts and monthly counts filtered by entry type in dplyr在 dplyr 中创建按条目类型过滤的每月总计数和每月计数
【发布时间】:2021-09-20 17:08:02
【问题描述】:

我已经在这个问题上纠结了好几次了,我想问这个问题可能更省时。答案可能是我不知道的相对简单的事情,因为这似乎是一项常见的任务,尽管我找不到类似的在线示例。

在人们完成的活动列表中,我试图获得一个精简的活动计数列表,因为 group_by(Person) %>% summarise() 将用于每个人。我正在努力实现以下最终结果:

每行 1 人

列(每个人):

-总活动

-每种类型的总数

-每个子类型的总数(计算类型+子类型的组合无关紧要)

-每个月的总数(所以每个月都是一列)

-每个月的总类型计数(12 mos X 2 Types = 24 列)

-每个月的子类型总数 (12 mos X 3 个子类型 = 36 列)

如果一个月没有计数(如示例中没有 7 月至 12 月),则需要读取 0,即不排除该月。

activities <- data.frame(
  Person = c(rep("Person A", 3), rep("Person B", 3)), 
  Month = seq(as.Date("2020/1/1"), by = "month", length.out = 6),
  Activity.Type = as.factor(seq(1:2)),
  Activity.Sub.Type = as.factor(seq(1:3))
  )
activities

所有月份的列可能看起来很奇怪,但我将这些数据添加到回归模型中每个人的年度生产力指标中。这似乎是为该用例构建所有内容的最佳方式。

如果您有任何问题,请告诉我,感谢您的帮助。

【问题讨论】:

  • 你需要activities %&gt;% group_by(Person) %&gt;% summarise(across(where(is.factor), nlevels), n = n())
  • 您确定要每人一排吗?当您说 “如果一个月没有计数(因为在示例中没有 7 月至 12 月),它需要读取 0 即不排除该月。” 听起来就像您希望每个人每月一排一样。您需要 group_by 人和月。
  • 非常感谢!活动 %>% group_by(Person) %>% summarise(across(where(is.factor), nlevels), n = n()) 似乎产生了每个人独特活动类型的数量,而不是计数对于每个活动类型。这不是问题的要求。 Gregor:这很有道理,你可能正在做某事。在那种情况下,我仍然不确定如何连续几个月没有活动,例如示例中为 7 月至 12 月。
  • 感谢您分享数据,但如果您也分享预期的输出,这将非常有帮助,这样我们就可以将我们的答案与他们进行比较,并为您提供您正在寻找的确切信息。跨度>

标签: r dplyr


【解决方案1】:

我不确定。但也许你正在寻找这样的东西:

library(dplyr)
library(tidyr)

df_month <- activities %>% 
    group_by(Person, Month) %>% 
    add_count() %>% 
    add_count(Activity.Type) %>% 
    add_count(Activity.Sub.Type) %>% 
    summarise(Total_activites = sum(n), Activity.Type=sum(nn), Activity.Sub.Type=sum(nnn)) %>% 
    pivot_wider(
        names_from = Month, 
        values_from = Total_activites:Activity.Sub.Type
    )

activities %>% 
    group_by(Person) %>% 
    add_count() %>% 
    add_count(Activity.Type) %>% 
    add_count(Activity.Sub.Type) %>% 
    summarise(Total_activites = sum(n), Activity.Type=sum(nn), Activity.Sub.Type=sum(nnn)) %>% 
    right_join(df_month, by="Person")

Person   Total_activites Activity.Type Activity.Sub.Type `Total_activite~ `Total_activite~ `Total_activite~ `Total_activite~ `Total_activite~ `Total_activite~
  <chr>              <int>         <int>             <int>            <int>            <int>            <int>            <int>            <int>            <int>
1 Person A               9             5                 3                1                1                1               NA               NA               NA
2 Person B               9             5                 3               NA               NA               NA                1                1                1
# ... with 12 more variables: Activity.Type_2020-01-01 <int>, Activity.Type_2020-02-01 <int>, Activity.Type_2020-03-01 <int>, Activity.Type_2020-04-01 <int>,
#   Activity.Type_2020-05-01 <int>, Activity.Type_2020-06-01 <int>, Activity.Sub.Type_2020-01-01 <int>, Activity.Sub.Type_2020-02-01 <int>,
#   Activity.Sub.Type_2020-03-01 <int>, Activity.Sub.Type_2020-04-01 <int>, Activity.Sub.Type_2020-05-01 <int>, Activity.Sub.Type_2020-06-01 <int>

【讨论】:

  • 感谢您浏览这个 TarJae!我认为人 A 的 Total_Activities 应该是 3,与人 B 相同。不过,我会考虑你的答案,我过去没有使用过 add_count(),这似乎很合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多