我有一个20个长度向量的列表,我想根据长度向量的名称将每个长度乘以三个矩阵之一。这是我失败的尝试。请提出我如何改进代码的建议。任何帮助深表感谢!
for (i in 1:length(List)){
.$Value=ifelse(names(List) %in% c("a","b","c"),matrixA%*%.$Value,ifelse(names(List) %in% c("d","e"),matrixB%*%.$Value, matrixC%*%.$Value))
}
我的列表的一部分和矩阵包括在下面。
list(a = structure(c(3, 0, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 1, 1), .Dim = c(20L, 1L)), b = structure(c(2,
0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 0), .Dim = c(20L,
1L)))
matrixA <- diag(2,20)
matrixB <- diag(1,20)
matrixC <- diag(4,20)
答案 0 :(得分:1)
可能对您有帮助
nm1 <- paste0("matrix", toupper(names(lst1)))
Map(crossprod, lst1, mget(nm1))
答案 1 :(得分:0)
所以...不确定我是否理解。但是,如果列表名称为 a,b或c ,那么您想将其乘以 matrixA ,如果您想要的是 d或e 将其乘以 matrixB ,如果两者都不乘,则应将值乘以 matrixC 。
让我们使用您的示例。
zz <- list(a = structure(c(3, 0, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 1, 1), .Dim = c(20L, 1L)), b = structure(c(2,
0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 6, 0), .Dim = c(20L,
1L)))
matrixA <- diag(2,20)
matrixB <- diag(1,20)
matrixC <- diag(4,20)
这可能不是最佳解决方案,但这是一个简单的解决方案。我只是对您的思想进行了一些调整,使其可以正常工作,在内的一个矩阵需要受 list()保护(因为列表是一个向量,ifelse可以使用向量) ifelse()否则,您只会得到第一个元素。这将为您返回结果列表。
results <- lapply(seq_along(zz), function(i){
ifelse(names(zz[i]) %in% c("a","b","c"),list(matrixA%*%zz[[i]]),
ifelse(names(zz[i]) %in% c("d","e"), list(matrixB%*%zz[[i]]), list(matrixC%*%zz[[i]])))
})
我用lapply将序列(对zz的长度为1)应用于定义的函数。对于每个 i ,函数都会查看 i 元素的名称 zz (zz [i]返回列表元素的名称),然后如果满足条件,我们将 zz 的 i 元素的内容相乘(zz [[i]]只是返回 i 的内容列表中的元素(没有其名称))。
这也有效,您无需使用list()来保护矩阵。
results <- lapply(seq_along(zz), function(i){
if(names(zz[i]) %in% c("a","b","c")) matrixA%*%zz[[i]] else
if(names(zz[i]) %in% c("d","e")) matrixB%*%zz[[i]]
else matrixC%*%zz[[i]]
})
编辑:@akrun答案更漂亮,更简短。