首页 > 解决方案 > 仅在数据帧的特定行或日期上应用具有滚动估计窗口的函数

问题描述

是否可以将具有滚动窗口的函数应用于此数据框:

Name Date    market_return  stock_return  RESULT
AAL  1.1.15   3%              5%
AAL  2.1.15   2%              1%
...
AAPL 1.1.15   3%              4%
AAPL 2.1.15   2%              3%
...

但是,只有在匹配这些特定日期和名称时:

Name Date    
AAL  4.4.15
AAL  15.6.15
...
AAPL 5.6.15
AAPL 5.7.15
...

结果应该类似于:

Name Date    market_return  stock_return  RESULT
AAL  1.1.15   3%              5%           NA
AAL  2.1.15   2%              1%           NA
...
AAL  4.4.15   3%              5%           xxx
...
AAL  15.6.15  3%              5%           xxx
...
AAPL 1.1.15   3%              4%           NA
AAPL 2.1.15   2%              3%           NA
...
AAPL 5.6.15   2%              5%           xxx
...
AAPL 5.7.15   2%              5%           xxx
...

谢谢!

标签: rwindow-functionsrolling-computation

解决方案


这个问题不是关于要执行的操作的具体问题,所以我们假设它是总和。

在最后的注释中,我们首先将数据读入数据帧,将Date列转换为Date类,将_return列转换为数值。

在名称和日期上将 DF 左连接到 DF2,在日期范围和名称上将 DF2 左连接到 DF,然后将 DF 的第二个实例中连接到 DF 的第一个实例的每一行的所有 stock_return 求和。

library(sqldf)

sqldf("select a.*, sum(b.stock_return) as RESULT
  from DF a
  left join DF2 c on a.Name = c.Name and a.Date = c.Date
  left join DF b on b.Date between c.Date - 185 and c.Date + 185 and 
    c.Name = b.Name
  group by a.rowid")

给予:

  Name       Date market_return stock_return RESULT
1  AAL 2015-01-01             3            3     NA
2  AAL 2015-01-02             2            2     NA
3  AAL 2015-04-04             3            3     11
4  AAL 2015-06-15             3            3     11
5 AAPL 2015-01-01             3            3     NA
6 AAPL 2015-01-02             2            2     NA
7 AAPL 2015-06-05             2            2      9
8 AAPL 2015-07-05             2            2      9

笔记

Lines <- "Name Date    market_return  stock_return
AAL  1.1.15   3%              5%
AAL  2.1.15   2%              1%
AAL  4.4.15   3%              5%
AAL  15.6.15  3%              5%
AAPL 1.1.15   3%              4%
AAPL 2.1.15   2%              3%
AAPL 5.6.15   2%              5%
AAPL 5.7.15   2%              5%"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)
DF <- transform(DF, Date = as.Date(Date, "%d.%m.%y"),
  market_return = as.numeric(sub("%", "", market_return)),
  stock_return = as.numeric(sub("%", "", stock_return)))

Lines <- "Name Date    
AAL  4.4.15
AAL  15.6.15
AAPL 5.6.15
AAPL 5.7.15"
DF2 <- read.table(text = Lines, header = TRUE, as.is = TRUE)
DF2$Date <- as.Date(DF2$Date, "%d.%m.%y")

更新

简化。


推荐阅读