我的数据集每天有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')
答案 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")