如何根据名称向量聚合列表中的矩阵?

N.V*_*ela 7 aggregate r list

我想根据存储在向量中的名称在列表中聚合(求和)矩阵.这里有一些示例数据:

lst <- list("111"=matrix(c(1, 0, 6, NA, 1, 0),
                              nrow = 1, byrow = T),
            "112"=matrix(c(6, 2, 2, 0, 3, NA),
                              nrow = 1, byrow = T),
            "113"=matrix(c(2, 3, 0, 0, 1, 1),
                         nrow = 1, byrow = T))
agg.nam <- c(111,113)
Run Code Online (Sandbox Code Playgroud)

我的预期结果是:

> res
$
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    3    6    0    2    1
Run Code Online (Sandbox Code Playgroud)

因此,第一个和第三个矩阵相加(na.rm = TRUE).

我首先尝试将agg.nam子集化:

lapply(lst, function(x) x[, which(names(x) %in% agg.nam)] )
Run Code Online (Sandbox Code Playgroud)

但是我在这一点上已经失败了,没有聚合.

jos*_*ber 4

您可以使用以下方法将相关列表元素抓取到矩阵中:

do.call(rbind, lst[as.character(agg.nam)])
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    0    6   NA    1    0
# [2,]    2    3    0    0    1    1
Run Code Online (Sandbox Code Playgroud)

然后所需要做的就是调用colSumsna.rm=TRUE感谢@docendodiscimus 指出了这种简化):

colSums(do.call(rbind, lst[as.character(agg.nam)]), na.rm=TRUE)
# [1] 3 3 6 0 2 1
Run Code Online (Sandbox Code Playgroud)

如果矩阵有多行,上面的简化就不会真正起作用,下面的方法可以更好地实现这一点:

# Grab relevant list elements
mats <- lst[as.character(agg.nam)]

# Replace any instance of NA with 0
mats <- lapply(mats, function(x) {  x[is.na(x)] <- 0 ; x  })

# Sum them up
Reduce("+", mats)
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    3    3    6    0    2    1
Run Code Online (Sandbox Code Playgroud)