在这里,我有一个包含开始日期和结束日期以及用法的数据集。我计算了这两天之间的天数并得到了每日使用量。 (我现在每天都可以使用一个扁平的用法)。
现在,我想要实现的是6月份那些TIME-FRAME中每一天的使用总和。例如,第一种情况只是Daily_usage
file://
而且,对于第二,我想将使用3905添加到6月1日,也是6月2日,因为它在6月1日和6月2日都有。
START_DATE END_DATE x DAYS DAILY_USAGE
1 2015-05-01 2015-06-01 261605.00 32 8175.156250
我想继续为所有387行执行此操作,最后获取每天的用法总和。并且,我不知道如何为数百条记录执行此操作。 这就是我的数据集现在的样子:
2015-05-04 2015-06-02 117159.00 30 3905.3000000
此外,标题。
str(YYY)
'data.frame': 387 obs. of 5 variables:
$ START_DATE : Date, format: "2015-05-01" "2015-05-04" "2015-05-11" "2015- 05-13" ...
$ END_DATE : Date, format: "2015-06-01" "2015-06-01" "2015-06-01" "2015-06-01" ...
$ x : num 261605 1380796 183 103 489 ...
$ DAYS : num 32 29 22 20 19 12 1 34 30 29 ...
$ DAILY_USAGE: num 8175.16 47613.66 8.32 5.13 25.74 ...
依旧........
数据集和结果示例
我将调用此数据集。例1(3天,模拟数据)
START_DATE END_DATE x DAYS DAILY_USAGE
1 2015-05-01 2015-06-01 261605.00 32 8175.1562500
2 2015-05-04 2015-06-01 1380796.00 29 47613.6551724
6 2015-05-21 2015-06-01 1392.00 12 116.0000000
7 2015-06-01 2015-06-01 2503.00 1 2503.0000000
8 2015-04-30 2015-06-02 0.00 34 0.0000000
9 2015-05-04 2015-06-02 117159.00 30 3905.3000000
10 2015-05-05 2015-06-02 193334.00 29 6666.6896552
13 2015-05-04 2015-06-03 630.00 31 20.3225806
对于上面的例子,答案应该是这样的
START_DATE END_DATE x DAYS DAILY_USAGE
5/1/2015 6/1/2015 261605 32 8175.15625
5/4/2015 6/1/2015 1380796 29 47613.65517
5/11/2015 6/1/2015 183 22 8.318181818
4/30/2015 6/2/2015 0 34 0
5/20/2015 6/2/2015 70 14 5
6/1/2015 6/2/2015 569 2 284.5
6/1/2015 6/3/2015 582 3 194
6/2/2015 6/3/2015 6 2 3
怎么样? 在示例1中,对于6月1日,我添加了除最后一行使用之外的所有用法行,因为最后一行不包括时间范围内的日期06/01。它从06/02开始,到06/03结束。
要获得6月2日,我已将第4行的所有用法添加到第8行,因为6月2日介于所有开始日期和结束日期之间。
6月3日,我只添加,最后两行得到197。
那么,何处总和,取决于Start&的时间范围。 END_DATE。
希望这有帮助!
这可能有一个简单的技巧,而不是编写400行If else语句。
再次感谢您的时间!!
-Gyve
答案 0 :(得分:1)
library(lubridate)
indx <- lapply(unique(mdy(df[,2])), '%within%', interval(mdy(df[,1]), mdy(df[,2])))
cbind.data.frame(DAY=unique(df$END_DATE),
USAGE=unlist(lapply(indx, function(x) sum(df$DAILY_USAGE[x]))))
# DAY USAGE
# 1 6/1/2015 56280.63
# 2 6/2/2015 486.50
# 3 6/3/2015 197.00
<强>解释强>
我们可以扩展它来解释发生了什么:
indx <- lapply(unique(mdy(df[,2])), '%within%', interval(mdy(df[,1]), mdy(df[,2])))
测试唯一结束日期在第一列和第二列的范围天数内。 mdy
是使用lubridate转换为POSIXct
的快捷方式。运算符%within%
根据间隔测试日期。我们使用interval('col1', 'col2')
创建了时间间隔。这将创建一个索引,我们可以通过它来对数据进行子集化。
在我们的最终数据框中,
cbind.data.frame(DAY=unique(df$END_DATE),
创建第一列日期。
和
USAGE=unlist(lapply(indx, function(x) sum(df$DAILY_USAGE[x])))
将df$DAILY_USAGE
的总和除以我们创建的索引。