在不同数据框中查找月日期范围内的每日变量总和

时间:2015-03-19 16:05:07

标签: r date linear-regression

我们的外部数据包含每日价值(以该格式提取到数据库),需要将其添加到近似月度值,与另一个显示近似月度值的外部数据集对齐(YYYY-MM-DD的日期范围在单独的该集中的列)。新数据构成了线性回归的基础。

我们想用R来:

  1. 在data1中添加每日日期值,该日期值符合data2中日期范围的月度值。换句话说,如果"开始"在Data2 = 2015-02-14和"结束"在Data2 = 2015-03-15,我们想知道2015-02-14到2015-03-15范围内data1的columnX中变量的每日总值。
  2. 无法找出逻辑函数,从Data2中的info自动定义Data1中的参数。这个等式是否接近?

    monthly=sum(data1$variable, if(data1$Date > Data2$StartDate &  data1$Date < Data2$endDate))
    

    data1 $变量在data1 $ Date的行中。

    上述等式中的错误=错误:意外&#39;)&#39;

    我们无法弄清楚如何建立这个论点。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

假设您有data1和data2,如下所示

daysInData1 <- seq(as.Date('2013-03-1'), as.Date('2014-12-07'), by = 'day')
data1 <- data.frame(Date = daysInData1, variable = runif(length(daysInData1))) 

daysInData2 <- seq(as.Date('2013-03-15'), as.Date('2015-03-14'), by = 'month')
data2 <- data.frame(StartDate = daysInData2, volume = seq(length(daysInData2)), )

他们应该看起来像

>data1
    Date       variable
1   2013-03-01 0.944390132092
2   2013-03-02 0.168255153345
3   2013-03-03 0.919271149905
4   2013-03-04 0.456344844541
5   2013-03-05 0.365338093136
6   2013-03-06 0.158996492159
(...omit the rest)

>data2
   StartDate volume
1  2013-03-15      1
2  2013-04-15      2
3  2013-05-15      3
(...omit the rest)

您可以使用for循环根据data2日期范围对data1进行分类

for( i in 1:nrow(data2))
{
    data1[data1$Date >= data2[(i), 'StartDate'] & data1$Date < data2[nrow(data2), 'StartDate'], 'DateMonthlySeg'] <- data2[i, 'StartDate']
}

然后聚合以获取data1中每个类别中的总和,并与data2合并(为了方便回归)

data2 <- merge(data2, aggregate(variable ~ DateMonthlySeg, data = data1, sum), 
           by.x = 'StartDate', by.y = 'DateMonthlySeg')

最后,执行线性回归

>lm(volume~variable, data = data2)

Call:
lm(formula = volume ~ variable, data = data2)

Coefficients:
(Intercept)     variable  
10.33248635   0.04394532