在R中为大数据集运行for循环时出错

时间:2014-11-01 08:43:43

标签: r

我的数据集每天有900家公司的回报。我想为每个日期的公司计算Ri x Rj,其中Ri和Rj分别是第i和第j家公司的回报。

我的数据集如下所示:

Company Code         Date           r
ABB.NS             2008-08-01       0.98
ABB.NS             2008-08-02       0.96
.
.
ABAN               2008-08-01       0.92
ABAN               2008-08-02       0.87

我为它创建了一个函数乘数。它适用于小样本。但是,我的数据集很大,并且会输出大约8,00,000个RiRj.So值,我包含了一个检查语句(print(length(z))来监视循环的进度。现在这个函数在整个过程中使用了数据进入某种重复循环。我认为可能是因为print语句(8,000个条目一次不打印?)但是在删除print语句时,它只返回check语句,即print (长度(z))而不是RiRj。有什么方法可以解决这个问题吗?

multiplier <- function(x)
{  
  z <- vector()
  for(i in 1:(length(x)))
  { 
    k <- length(x)*(i-1)
    for(j in 1:length(x))
    {
      z[k+j] <- x[i]*x[j]

      if((k+j)%%1000 == 0)
      {
            print(length(z))
      }
    } 
  }
print(z)
}

Ri.Rj <- aggregate(Companies$r, list(Companies$Date), FUN=multiplier)
Ri.Rj <- setDT(Ri.Rj)[, list(x = unlist(x)), by = Group.1]
colnames(Ri.Rj) <- c('Date', 'RiRj')

1 个答案:

答案 0 :(得分:0)

可能有帮助:

library(data.table)
DT <- data.table(Companies)
setkey(DT, Date)
DT[,list(RiRj=Reduce(`*`,CJ(r,r))), by=Date]
#         Date   RiRj
#1: 2008-08-01 0.8464
#2: 2008-08-01 0.9016
#3: 2008-08-01 0.9016
#4: 2008-08-01 0.9604
#5: 2008-08-02 0.7569
#6: 2008-08-02 0.8352
#7: 2008-08-02 0.8352
#8: 2008-08-02 0.9216

或者

DT[, CJ(r,r), by=Date][, RiRj:=V1*V2][,c(1,4), with=FALSE]

根据您的代码:

 aggregate(Companies$r, list(Companies$Date), FUN=multiplier)
 #     Group.1    x.1    x.2    x.3    x.4
 #1 2008-08-01 0.9604 0.9016 0.9016 0.8464
 #2 2008-08-02 0.9216 0.8352 0.8352 0.7569

数据

Companies <- structure(list(Company.Code = c("ABB.NS", "ABB.NS", "ABAN", "ABAN"
), Date = structure(c(14092, 14093, 14092, 14093), class = "Date"), 
r = c(0.98, 0.96, 0.92, 0.87)), .Names = c("Company.Code", 
"Date", "r"), row.names = c(NA, -4L), class = "data.frame")