【问题标题】:Summarise data frame by date inside validity period在有效期内按日期汇总数据框
【发布时间】:2019-09-10 09:58:14
【问题描述】:

我有一个数据框 df,其中包含 validFrom、validTo 列。

df = structure(list(uid = c(5001334L, 5001346L, 5001645L, 5002209L, 
5002613L, 5002871L, 5003095L, 5003112L, 5003306L, 5003576L, 5003655L, 
5003667L, 5003679L, 5003681L), value = c(26655L, 16196L, 17928L, 
16155L, 10852L, 12340L, 14339L, 10190L, 11342L, 11447L, 12843L, 
12285L, 16435L, 10496L), validFrom = structure(c(-63158400, -444528000, 
-394588800, -320889600, -788918400, -378691200, -578620800, -334108800, 
-536457600, -312940800, -412905600, -397180800, -231465600, -839030400
), class = c("POSIXct", "POSIXt"), tzone = ""), validTo = structure(c(278640000, 
410140800, 546739200, 460080000, 725760000, 296956800, 299548800, 
441676800, 323308800, 483667200, 444355200, 275961600, 420508800, 
-58060800), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA, 
-14L), class = "data.frame", .Names = c("uid", "value", "validFrom", 
"validTo"))

我们如何为sort(unique(c(df$validTo, df$validFrom))) 中每个日期有效的所有uid 求和value

outpout 将是一个包含 2 列的数据框: * 来自sort(unique(c(df$validTo, df$validFrom))) 的日期 * date 在validFrom和validTo之间的每一行的总和

我想避免循环,因为我的数据框很长,有很多日期!

乐于使用任何包,基础 R 包或 tidyr/dplyr/table

【问题讨论】:

  • 你能显示你的预期输出吗?
  • 是什么让value 无效
  • @RuiBarradas 如果日期在 validFrom 和 validTo 之间,则行条目有效

标签: r dplyr tidyr


【解决方案1】:

这是一种方法,我们将其重塑为更长的形式,每个书挡都有一行,我们在 validFrom 处递增,在 validTo 处递减。

library(dplyr)
df %>%
  tidyr::gather(valid_type, datetime, -c(uid, value)) %>%
  arrange(datetime) %>%
  mutate(change = value * if_else(valid_type == "validFrom", 1, -1),
         validSum = cumsum(change))

#      uid value valid_type            datetime change validSum
#1 5003681 10496  validFrom 1943-05-31 17:00:00  10496    10496
#2 5002613 10852  validFrom 1944-12-31 17:00:00  10852    21348
#3 5003095 14339  validFrom 1951-08-31 17:00:00  14339    35687
#4 5003306 11342  validFrom 1952-12-31 16:00:00  11342    47029
#5 5001346 16196  validFrom 1955-11-30 16:00:00  16196    63225
#6 5003655 12843  validFrom 1956-11-30 16:00:00  12843    76068
#etc.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多