【问题标题】:How to multiply matching columns between lists?如何在列表之间乘以匹配列?
【发布时间】:2015-02-09 07:45:03
【问题描述】:

我有 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 对象列表(它具有时间信息)。

我们将不胜感激。谢谢!

【问题讨论】:

    标签: r list matrix-multiplication 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
    )
    

    【讨论】:

    • 你的解释很有教养。现在我对mapply 有了更好的理解。谢谢!
    • 在那之后,我运行lapply(list, function(x) { x &lt;- rowSums(x) }) 以获得每日回报。正如我在问题中评论的那样,其中一个列表(返回)实际上是一个 xts 对象列表。因此,我希望有一个 xts 对象列表。你能给出一个提示吗? (我需要上面的日期信息。)
    • @JorgeDias,我不熟悉 xts 对象,所以我不能对此发表太多评论。我会注意,因为你正在做 rowsums 部分,你真的应该做 Y[, colnames(X)] %*% c(X) 一步获得相同的结果。
    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多