r - 将 Data.Tables (R) 与循环或 mapply 组合

标签 r data.table mapply

我对 R 中的数据表很陌生,并且已经成功完成了 80% 的分析。背景是我想获得股票5天(之前和之后)的返回,然后是报告后25天和45天的返回。我已经成功地针对一组日期完成了此操作(有效地硬编码),但是当我尝试自动化该过程时,它崩溃了。

我将从我当前的公式开始,然后解释数据。

该公式成功查看数据表并返回我需要的总和。问题是 datem5 和 V1 需要通过循环(或 mapply)来自动化该过程。

CQR_Date[CQR_DF[CQR_Date, sum(CQR), on = .(unit, date >= date1, date <= datem5),
            by = .EACHI], newvar := V1, on = .(unit, date1=date)]

我尝试过这个(以及许多其他变体)。请注意 newvar 也需要解决。

for (i in 1:4) {
              CQR_Date[CQR_DF[CQR_Date, sum(CQ), on = .(unit, date >= date1, date <= cols[,..i]),
              by = .EACHI], newvar := v, on = .(unit, date1=date)]

但出现此错误

Error: argument specifying columns specify non existing column(s): cols[3]='cols[, ..i]'

有趣的是,当我尝试时

for (i in 1:2) {
 y <- cols[,..i]}

没有问题。

现在就数据而言;

  • col 仅包含我需要从 CQR_Data 获取的列标题

    cols <- data.table("datem5", "datep5", "datep20", "datep45")

CQ_Data 具有股票 CQ 的报告日期,如下所示

 CQ_Date <- data.frame("date1" = anydate(c("2016-02-17", "2016-06-12", "2016-08-17")))
 CQ_Date$datem5 <- CQ_Date$date1 - 5  # minus five days
 CQ_Date$datep5 <- CQ_Date$date1 + 5  # plus five days
 CQ_Date$datep20 <- CQ_Date$date1 + 20
 CQ_Date$datep45 <- CQ_Date$date1 + 45
 CQ_Date$unit <- 1    # I guess I need this for some sort of indexing

然后 CQ_DF(股票的对数 yield )由以下公式构成:

 CQ_DF <- data.frame("unit" = rep(1,300))
 CQ_DF$CQ <- rnorm(10)
 CQ_DF$date <- seq(as.Date("2015-12-25"), by = "day", length.out = 300)
 CQ_DF$unit <- 1

将它们设置为 DT 之前

setDT(CQ_DF)
setDT(CQ_Date)

任何帮助将不胜感激。请注意,这使用了

  library(data.table)
  library(anytime)     

简化版本是:

  CQ_Date <- data.frame("date1" = c(10, 20))
  CQ_Date$datep5 <- CQ_Date$date1 + 5  # plus five days
  CQ_Date$datep20 <- CQ_Date$date1 + 10
  CQ_Date$unit <- 1 

  CQ_DF <- data.frame("unit" = rep(1,100))
  CQ_DF$CQ <- seq(1, by = 1, length.out = 100)
  CQ_DF$date <- seq(1, by = 1, length.out = 100)
  CQ_DF$unit <- 1

  setDT(CQ_DF)
  setDT(CQ_Date)

  cols <- c("datep5", "datep20" )

  tmp <- melt(CQ_Date, measure.vars = cols)
  setDT(tmp)

  tmp[CQ_DF[tmp, sum(CQ), on = .( unit, date >= date1,  date <= value), by = 
  .EACHI],newvar := V1, on = .(unit, date1=date  )]

现在的问题是总和似乎无法正常工作。这可能与“变量”变量有关。

最佳答案

不要使用 mapplyfor 循环,而是尝试使用 melt 以长格式 reshape 数据集,在数字之间创建序列,执行连接并计算总和

library(data.table)
cols <- c("datep5", "datep20" )

tmp <- melt(CQ_Date, measure.vars = cols)
tmp <- melt(CQ_Date, measure.vars = cols)
tmp <- tmp[, list(date = seq(date1, value)), .(unit, variable, date1, value)]
tmp <- merge(tmp, CQ_DF, by = c('unit', 'date'))
tmp[, .(newvar = sum(CQ)), .(unit, variable, date1)]

#   unit variable date1 newvar
#1:    1   datep5    10     75
#2:    1  datep20    10    165
#3:    1   datep5    20    135
#4:    1  datep20    20    275

如果您需要以宽格式返回数据,可以使用dcast


等效的tidyverse选项是:

library(tidyverse)

CQ_Date %>%
  pivot_longer(cols = cols) %>%
  mutate(date = map2(date1, value, seq)) %>%
  unnest(date) %>%
  left_join(CQ_DF, by = c('unit', 'date')) %>%
  group_by(unit, name, date1) %>%
  summarise(newvar = sum(CQ))

关于r - 将 Data.Tables (R) 与循环或 mapply 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63225414/

相关文章:

python - 将几列分组,然后在 Pandas 中聚合一组列(与 R 的 data.table 相比,它严重崩溃)

在 mapply 中返回多个列表

r - 如何循环遍历 R 中的 mapply?

r - 使用 mapply 将向量中的模式替换为 tm 中向量中的替换

r - 用 ";"分隔变量并创建新行

r - 在使用粘贴的公式创建的LME拟合上,方差分析测试失败

r - data.table 的 'j' 新添加的列应该在范围内可用

r - 从数据框中仅选择数字列

r - R中的高效随机抽样

R - Data.table - 在 RHS 操作中使用变量列名