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之间,则行条目有效