问题描述
我的数据具有不同的开始和结束日期。
mydata <- data.frame(id=c(1,2,3),start=c("2010/01/01","2010/01/01","2010/01/02"),end=c("2010/01/01","2010/01/05","2010/01/03"),a=c(140,750,56),b=c(48,25,36))
mydata
id start end a b
1 1 2010-01-01 2010-01-01 140 48
2 2 2010-01-01 2010-01-05 750 25
3 3 2010-01-02 2010-01-03 56 36
我想查找每天变量@H_502_7@ a 和@H_502_7@ b 的平均值。在下面,我通过展开每行中具有不同开始和结束日期的行来执行它,然后将其折叠回每天的水平。
mydata$subt <- as.numeric(as.Date(mydata$end,"%Y/%m/%d") - as.Date(mydata$start,"%Y/%m/%d") + 1)
require(data.table)
mydata <- setDT(mydata)[,list(idnum = id,date = seq(start,end,by = "day"),a=a/subt,b=b/subt),by = 1:nrow(mydata)]
mydata
nrow idnum date a b
1: 1 1 2010-01-01 140 48
2: 2 2 2010-01-01 150 5
3: 2 2 2010-01-02 150 5
4: 2 2 2010-01-03 150 5
5: 2 2 2010-01-04 150 5
6: 2 2 2010-01-05 150 5
7: 3 3 2010-01-02 28 18
8: 3 3 2010-01-03 28 18
mydata %>%
group_by(date) %>%
summarize(a = sum(a),b = sum(b))
所需结果:
date a b
<date> <dbl> <dbl>
1 2010-01-01 290 53
2 2010-01-02 178 23
3 2010-01-03 178 23
4 2010-01-04 150 5
5 2010-01-05 150 5
但是,我有很多行具有不同的开始和结束日期,有时差异的长度非常长。我想知道是否有更简单的方法(即不展开每一行)来查找每个变量的每日平均值。如果有一种方法可以找到每周平均值而不先找到每日数字,那也很好。谢谢!
解决方法
这里是tidyverse
的一个选项。我们使用Date
(从ymd
)将“开始”“结束”列转换为lubridate
类,从“开始”到“结束”创建seq
个日期对于具有map2
,mutate
'a','b'的相应元素,将它们除以lengths
列'date',list
的{{1}} “日期”并按“日期”分组,我们得到“ a”,“ b”的unnest
sum