【问题标题】:R Subsetting a dataframe by date-rangeR按日期范围对数据框进行子集
【发布时间】:2017-08-12 00:07:13
【问题描述】:

我想按日期范围组织数据框。

假设今天是 2017 年 1 月 1 日,下表显示:

  • 三种产品(苹果、香蕉和啤酒)

  • 五个有效期(2017 年 1 月 15 日、2017 年 2 月 27 日、2017 年 3 月 15 日、2017 年 9 月 1 日和 2018 年 1 月 10 日)

产品类型 1/15/2017 2/27/2017 3/15/2017 9/1/2017 12/20/2017 1/10/2018 苹果 3 10 - 2 8 - 香蕉 5 50 100 10 10 2 啤酒 1 1 1 1 1 1

您可以将上表解读为“店长有 3 个苹果的有效期为 2017 年 1 月 15 日,其他 10 个苹果的有效期更长,有效期为 2017 年 2 月 27 日等。”

商店经理很想知道有多少苹果会在不到 1 个月、1 到 3 个月、3 到 12 个月和 12 个月以上过期。

请问如何在 R 中编写代码? 结果表如下所示:

产品类型 不到 1 个月 1-3 个月 3-12 个月 超过 12 个月 苹果 3 10 10 - 香蕉 5 150 20 2 啤酒 1 2 2 1

非常感谢您的帮助!

【问题讨论】:

  • 您是否尝试过编写代码?你有什么想法?

标签: r date dataframe subset date-range


【解决方案1】:

使用函数tidyverselubridate 的解决方案。 dt2 是最终输出。

dt <- read.table(text = "'Product Type'    '1/15/2017'   '2/27/2017'   '3/15/2017'   '9/1/2017'    '12/20/2017'  '1/10/2018'
Apple           3           10          -           2           8           -   
                 Banana          5           50          100         10          10          2 
                 Beer            1           1           1           1           1           1",
                 header = TRUE, stringsAsFactors = FALSE, na.strings = "-")


library(tidyverse)
library(lubridate)

dt2 <- dt %>%
  gather(Date, Value, -Product.Type) %>%
  mutate(Date = sub("X", "", Date, fixed = TRUE)) %>%
  mutate(Date = mdy(Date)) %>%
  mutate(Day_Diff = Date - mdy("1/1/2017")) %>%
  mutate(Group = case_when(
    Day_Diff <= 30  ~ "Less than 1mth",
    Day_Diff <= 90  ~ "1-3mths",
    Day_Diff <= 361 ~ "3-12 mths",
    TRUE            ~ "More than 12mths"
  )) %>%
  group_by(Product.Type, Group) %>%
  summarise(Value = sum(Value, na.rm = TRUE)) %>%
  spread(Group, Value) %>%
  select(`Product Type` = Product.Type, `Less than 1mth`, `1-3mths`, 
         `3-12 mths`, `More than 12mths`)

【讨论】:

    【解决方案2】:

    data.table回答:

    library(data.table)
    
    dt <- data.table(type=c("apple", "banana", "beer"), 
                     `2017-01-15`=c(3,5,1),
                     `2017-02-27`=c(10,50,1),
                     `2017-03-15`=c(NA, 100, 1),
                     `2017-09-01`=c(2,10,1),
                     `2017-12-20`=c(8,10,1),
                     `2018-01-10`=c(NA, 2, 1))
    
    dt2 <- melt(dt, id.vars=c("type"))
    dt2[, days_until_expires:=as.IDate(variable) - as.IDate("2017-01-01")]
    dt2[, days_until_expires_f:=cut(days_until_expires, c(0, 30, 90, 360, Inf))]
    
    out1 <- dt2[, list(N=sum(value, na.rm=T)), by=list(type, days_until_expires_f)]
    out2 <- dcast(out1, type ~ days_until_expires_f, value.var="N")
    

    out2 是您的输出。

    将来,您可以通过提供完整的最小工作示例 (MWE) 让用户更轻松地为您提供帮助。请参阅here 获取指导。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2020-10-17
      • 2017-05-12
      相关资源
      最近更新 更多