【问题标题】:How to group together X number of days to get total amount of occurences?如何将 X 天组合在一起以获得总发生次数?
【发布时间】:2021-05-08 03:13:40
【问题描述】:

我有一个 df (due_date),其中 1000 行按升序排列,每行是事件发生后的一天(如“1 天、2 天等”,时间格式为“天”),所以 c1 是每一天,c2 是每一天的人数。这是我的 df 的一个小例子:

diff_in_days  number_of_people
1 days        100
2 days        50
3 days        200
4 days        20
5 days        25
6 days        500

我正在尝试找出一个代码,我可以用它来组合一定天数,然后从该分组中获取总人数。例如,我想将“1 天到 3 天”分组,得到总数 350,然后将天数 >= 4 分组,得到 545。新的数据框看起来像这样:

diff_in_days  number_of_people
1:3 days      350
>=4 days      545

到目前为止,我已经尝试过 group_by 的不同组合,例如:

due_date %>%
 group_by(diff_in_days == 0:3, >=4)

due_date %>%
  group_by(diff_in_days == "0 days:3 days", ">=4 days")

due_date %>%
 group_by(diff_in_days(==0:3,>=4)

如果我尝试对多天进行分组,R 在第一个“组”之后会给我“意外符号”:

Error: unexpected '==' in:
"due_date %>%
group_by(diff_in_days(=="

我试过带/不带引号等。如果我只放:

due_date %>%
  group_by(diff_in_days == "0 days:3 days")

我得到第三列,其名为:diff_in_days == "0 days:3 days"

并且列中的每一行都用“FALSE”填充。用于查找日期差异的单位是“天”,但如果我去掉 units = c("days"),它会将单位变成我不想要的秒。我有多个 df 的类似数据,但有时可能会丢失,因此数据可能如下所示,因此我无法在每个数据中应用相同的特定行号。具体分组必须基于我为 diff_in_day 选择的天数范围。

diff_in_days  number_of_people
3 days        200
4 days        20
6 days        500

如果我需要澄清任何事情,请告诉我,但由于敏感,我无法发布完整代码。提前致谢!

【问题讨论】:

  • 你需要一个简单的 ifelse。创建一个新变量或替换现有变量
  • due_date %>% group_by(diff_in_days = ifelse(diff_in_days > 3, '>=4', '1:3 days')) %>% summarise(number_of_people = sum(number_of_people))

标签: r


【解决方案1】:

也许您可以使用cut 并提供分界点来分成几组天。如果diff_in_days列是difftime,则可以添加as.numeric

library(dplyr)

due_date %>%
  group_by(group = cut(as.numeric(diff_in_days), 
                       breaks = c(1, 3, Inf), 
                       include.lowest = T)) %>%
  summarise(number_of_people = sum(number_of_people))

输出

  group   number_of_people
  <fct>              <int>
1 [1,3]                350
2 (3,Inf]              545

【讨论】:

    【解决方案2】:

    您可以尝试编写一个简单的函数来进行格式化和分组。首先,用数值替换字符串,然后用这些值聚合。像这样的:

    group_by_range = function(data, range) {
      col = data$diff_in_days
      col = gsub(" days", "", col)
      col = as.numeric(col)
      
      col = ifelse(col > max(range), sprintf(">=%s days", max(range) + 1), sprintf("%s:%s days", min(range), max(range)))
      res = aggregate(data$number_of_people, by = list(diff_in_days = col), FUN = sum)
      colnames(res) = colnames(data)
      return(res)
    }
    
    d = group_by_range(due_date, 1:3)
    
    

    输出:

      diff_in_days number_of_people
    1     >=4 days              545
    2     1:3 days              350
    

    【讨论】:

    • 我试过了,最后一行出现了这个错误:```名称错误(x)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-10-13
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多