【问题标题】:Multiply two lists of different length in R在R中将两个不同长度的列表相乘
【发布时间】:2021-01-26 03:27:54
【问题描述】:

我有两个不同结构的列表。列表 A 是数据帧列表(包含 1 行 10 列),列表 B 是 10x 10 矩阵列表,如下所示:

List A

[[1]]
[1] dataframe (of 1 column)
[[2]]
[1] dataframe (of 1 column)

List B
[[1]]
[1] num (1:10)
[[2]]
[2] num (10 x 10)

Example:
ListA <- list(A = A <- data.frame(matrix(rnorm(10), ncol = 10, nrow = 1)),
              B = B  <- data.frame(matrix(rnorm(10), ncol = 10, nrow = 1)))

ListB <- list(B = A <- rnorm(10),
              A = B  <- rnorm(10)
              C = C <- rnorm(10) )

我想为列表 B 的每个向量乘以 (%*%) 灯 A 的每个数据帧。 像这样:A%*%B, A%*%A, A%*%C, B%*%B, B%*%A, B%*%C 并且还有计算每个元素名称的结果。

我尝试了Map(%*%, ListA, ListB),但没有成功。

【问题讨论】:

  • 另外,由于列表的长度不同,是否有(或者更好的方法)使用元素名称来运行此操作?示例:ListA$A %*% ListB$BListA$A %*% ListB$AListA$A %*% ListB$CListA$B %*% ListB$BListA$B %*% ListB$AListA$B %*% ListB$C?

标签: r list dictionary apply


【解决方案1】:

我想你可以试试outer,如下所示

outer(ListA,ListB,FUN = Vectorize(function(x,y) as.matrix(x)%*%y))

结果看起来像

          B         A          C
A -1.336335 -1.291103  0.0925648
B -3.270517  4.648139 -3.8720215

【讨论】:

    【解决方案2】:

    我们也可以通过循环对象来做到这一点

    lapply(ListA, function(x) lapply(ListB, function(y) as.matrix(x) %*% y))
    

    【讨论】:

    • 谢谢。我需要的是一个向量结果,其中列表 A 的每个元素(每个数据框的列)的相关性 (%*%) 与列表 B 中表示为数字的每个元素(表示为数字向量)。
    【解决方案3】:

    尝试lapply 解决方案:

    lapply(1:length(ListA), function(x) lapply(1:length(ListB), 
                                        function(y) as.matrix(ListA[[x]]) %*%  ListB[[y]]))
    
    [[1]]
    [[1]][[1]]
              [,1]
    [1,] -4.061742
    
    [[1]][[2]]
              [,1]
    [1,] -1.401807
    
    [[1]][[3]]
             [,1]
    [1,] -1.53459
    
    
    [[2]]
    [[2]][[1]]
             [,1]
    [1,] 3.439579
    
    [[2]][[2]]
            [,1]
    [1,] 2.44288
    
    [[2]][[3]]
             [,1]
    [1,] 3.475746
    

    【讨论】:

    • 不应该是a lapply ;)
    • 感谢@BenNorris,但是查看结果,我不明白哪个操作返回了每个结果。有没有办法包含名称以使每个操作更明显
    • 你有什么建议,@Duck?
    • @BMT 我的意思是错字。
    • @Ben 很遗憾,您的建议没有奏效。我的两个列表要大得多,我看不到所有结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2017-07-23
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多