R 在有效期内按日期汇总数据帧

R 在有效期内按日期汇总数据帧,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一个数据帧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, 10852

我有一个数据帧
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"))
我们如何从排序(唯一的(c(df$validTo,df$validFrom)))为每个日期有效的所有uid求和
value

Output将是一个包含两列的数据帧: *排序日期(唯一(c(df$validTo,df$validFrom)) *日期介于validFrom和validTo之间的每行值的总和

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


很乐意使用任何包,基本R包或tidyr/dplyr/table

这里有一种方法,我们将每个书头都改成更长的形式,每个书头都有一行,我们在
有效时从
开始递增,在
有效时递减到

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.

您能显示您的预期输出吗?
无效的原因是什么?@ruibaradas如果日期介于validFrom和validTo之间,则行条目有效