【发布时间】:2015-03-31 16:02:17
【问题描述】:
现在我有两个数据框。一个包含超过 1100 万行的开始日期、结束日期和其他变量。第二个数据框包含加热度日的每日值(基本上是温度测量值)。
set.seed(1)
library(lubridate)
date.range <- ymd(paste(2008,3,1:31,sep="-"))
daily <- data.frame(date=date.range,value=runif(31,min=0,max=45))
intervals <- data.frame(start=daily$date[1:5],end=daily$date[c(6,9,15,24,31)])
实际上,我的每日数据框有 9 年的每一天,而我的间隔数据框的条目跨越此时间段内的任意日期。我想要做的是在我的intervals 数据框中添加一个名为nhdd 的列,该列对对应于该时间间隔的每日值求和(不包括结束)。
例如,在这种情况下,此新列的第一个条目将是
sum(daily$value[1:5])
第二个是
sum(daily$value[2:8]) and so on.
我尝试使用以下代码
intervals <- mutate(intervals,nhdd=sum(filter(daily,date>=start&date<end)$value))
这不起作用,我认为这可能与未正确引用列有关,但我不确定该去哪里。
我真的很想使用dplyr 来解决这个问题,而不是循环,因为使用 dplyr 1100 万行将花费足够长的时间。我尝试使用更多 lubridate,但 dplyr 似乎不支持 Period 类。
编辑:我现在实际上使用来自as.Date 的日期而不是lubridate,但如何从mutate 中引用不同数据框的基本问题仍然存在
【问题讨论】:
-
这个新列的第一个条目不是
sum(daily$value[1:6]),新列的第二行不是sum(daily$value[2:9])吗? -
它可以是任何一种方式,但我的一个变量是一个 id,并且数据框中的某处有另一行具有相同的 id 并且开始日期与上一个结束日期相同,所以为了避免重复计算,我将结尾设为排他性。