2014-12-10 25 views
1

我有2 lists。一个是股票权重和其他回报。这里有一个例子:如何乘以列表之间的匹配列?

a <- matrix(c(0.15, 0.20, 0.10, 0.30, 0.25), 1,5) 
colnames(a) <- c("AMBV4", "ARCZ6", "BBAS3", "BBDC4", "BRAP4") 
b <- matrix(c(0.20, 0.30, 0.40, 0.10), 1,4) 
colnames(b) <- c("ACES4", "AMBV4", "CMIG3", "CMIG4") 
listab<-list(a,b) 
c <- matrix(c(0.07, 0.22, 0.01, 0.05, 0.01, 0.12, 0.09, 0.09,0.03, 0.04, 0.21, 0.22, 0.01, 0.04, 0.55, 0.43), 2,8) 
colnames(c) <- c("AMBV4", "ARCZ6", "CLSC4", "BBAS3", "BBDC4", "CESP5" , "CMIG3", "BRAP4") 
d <- matrix(c(0.05, 0.12, 0.03, 0.04, 0.21, 0.22, 0.01, 0.04, 0.55, 0.43, 0.07, 0.22, 0.01, 0.05, 0.01, 0.12, 0.09, 0.09,0.03, 0.04), 2,10) 
colnames(d) <- c("ACES4", "ARCZ6", "AMBV4", "CLSC4", "CMIG3", "CMIG4", "BBAS3", "DASA3", "BBDC4", "BRTP3") 
listcd<-list(c,d) 

我想用的回报,但回报listcd比权重listab更多的股票乘以权重。我知道如何做到这一点,当它有相同数量的数据,但不是这样。下面是它应该如何结束:

result1 <- listab[[1]]*listcd[[1]][1, c(1,2,4,5,8)] 
result2 <- listab[[1]]*listcd[[1]][2, c(1,2,4,5,8)] 
x <- rbind(result1, result2) 
result3 <- listab[[2]]*listcd[[2]][1, c(1,3,5,6)] 
result4 <- listab[[2]]*listcd[[2]][2, c(1,3,5,6)] 
y <- rbind(result3, result4) 
list <- list(x,y) 

> list 
[[1]] 
     AMBV4 ARCZ6 BBAS3 BBDC4 BRAP4 
[1,] 0.0105 0.002 0.009 0.009 0.1375 
[2,] 0.0330 0.010 0.009 0.012 0.1075 

[[2]] 
    ACES4 AMBV4 CMIG3 CMIG4 
[1,] 0.010 0.063 0.220 0.007 
[2,] 0.024 0.066 0.172 0.022 

,我想应该指出的最后一点是,listcd实际上是一个XTS的对象列表(它有时间信息)。

任何帮助将被折衷。谢谢!

回答

1

这里是一个可能的解决方案:

mapply(function(X, Y) t(c(X) * t(Y[, colnames(X)])), listab, listcd) 

产地:

[[1]] 
     AMBV4 ARCZ6 BBAS3 BBDC4 BRAP4 
[1,] 0.0105 0.002 0.009 0.009 0.1375 
[2,] 0.0330 0.010 0.009 0.012 0.1075 

[[2]] 
    ACES4 AMBV4 CMIG3 CMIG4 
[1,] 0.010 0.063 0.220 0.007 
[2,] 0.024 0.066 0.172 0.022 

这里,我们使用mapply到功能应用到每个组值从每个列表。我们找到共同的名字,子集和乘法矩阵。转座和c(X)是必要的,以便矢量回收允许每个重量乘以每一行。

注意:以上只适用于保证每个有权重的股票存在listcd。如果没有,使用:

mapply(
    function(X, Y) { 
    names.common <- intersect(colnames(X), colnames(Y)) 
    t(X * t(Y[,colnames(X)])) 
    }, 
    listab, listcd 
) 
+0

非常说明你的解释。现在我明白了'mapply'。谢谢! – 2014-12-11 00:25:54

+0

之后,我正在运行'lapply(list,function(x){x < - rowSums(x)})'来获得每日回报。正如我在问题中所评论的,其中一个列表(返回)实际上是一个'xts'对象列表。我想结果一个xts对象列表。你能提供一个提示吗? (我需要它的日期信息。) – 2014-12-11 01:26:53

+1

@JorgeDias,我不熟悉xts对象,所以我不能对此做太多评论。我会注意到,因为你正在做rowsums部分,所以你应该真的执行'Y [,colnames(X)]%*%c(X)'来一步获得相同的结果。 – BrodieG 2014-12-11 01:30:41