【问题标题】:Is there a way in R to create two day aggregates from daily time series data?R中有没有办法从每日时间序列数据创建两天聚合?
【发布时间】:2020-12-19 00:47:03
【问题描述】:

您好,我有具有每日日期(变量 1)的时间序列数据,然后对于每个日期,我都有一个从 (1-60) 分配的时间变量。每天都有数 X 事件。有没有一种方法可以创建一个新的数据集,将我的价值的 2 天聚合相加,并且我有 30 行(时间变量)而不是 60 行?

更新:这是我想要的可重现示例

set.seed(101)

df <- data.frame(

      dte = c(as.Date("2021-01-01"),
      as.Date("2021-01-02") ,
      as.Date("2021-01-03"),
      as.Date("2021-01-04") ,
      as.Date("2021-02-01") ,
      as.Date("2021-02-02") ,
      as.Date("2021-02-03") ,
      as.Date("2021-02-04")
  ),
tme = rep(c(1, 2, 3, 4)),
val1 = sample(1:8),
work_type = c("Construction Worker", "Construction Worker","Construction 
Worker", "Construction Worker", "Sales", "Sales", "Sales", "Sales"),
Work_Site = "A"
)

print(df)

df_2day <- data.frame(
             tme = rep(c(1, 2)),
             val1 = c(9,13,5,9),
             work_type = c("Construction Worker", "Construction Worker", 
            "Sales", "Sales"),
            Work_Site = "A"
                      )

            print(df_2day)

我也有设施 B、C、D

【问题讨论】:

  • 我已经在上面提供了一个。谢谢
  • 值不应该是 9、15、5 和 7 吗?每 2 天(行)取总和?
  • 是的,对不起。有什么想法吗?

标签: r data-manipulation


【解决方案1】:

您可以创建 2 天组和 sum val1 值。

library(lubridate)
library(dplyr)

df %>%
  group_by(Work_Site, work_type, grp = ceiling_date(dte, '2 days')) %>%
  summarise(val1 = sum(val1))

#   Work_Site work_type           grp         val1
#  <chr>     <chr>               <date>     <int>
#1 A         Construction Worker 2021-01-03     9
#2 A         Construction Worker 2021-01-05    15
#3 A         Sales               2021-02-03     5
#4 A         Sales               2021-02-05     7

【讨论】:

    【解决方案2】:

    您可以通过将每天的行号除以 2 并四舍五入最接近的整数来识别分组。所以第三个读数是 3/2 = 1.5,四舍五入到第 2 组。第 10 个读数是 10/2 = 第 5 组。 下面是一个使用 dplyr 的实现,但你可以使用其他东西......

    library(dplyr)
    
    df <- data.frame(
        dte = c(as.Date("2021-01-01"),
                      as.Date("2021-01-01") ,
                      as.Date("2021-01-01"),
                      as.Date("2021-01-01") ,
                      as.Date("2021-02-01") ,
                      as.Date("2021-02-01") ,
                      as.Date("2021-02-01") ,
                      as.Date("2021-02-01")
        ),
        tme = rep(c(1, 2, 3, 4)),
        val1 = sample(1:8),
        val2 = sample(1:8)
    )
    
    print(df)
    
    result <- df %>%
        group_by(dte) %>%
        mutate(dategroup=ceiling(rank(tme) / 2)) %>%
        group_by(dte, dategroup) %>%
        summarise_all(sum)
    
    print(result)
    

    【讨论】:

    • 谢谢,我已经更清楚地说明了我的数据集是如何设置的。此代码似乎不适用于它。很抱歉之前没有举个例子
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多