将向量列表乘以以向量名称为条件的不同矩阵
Multiply a list of vectors to different matrices conditioned on the vectors' names
我有一个长度为 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)
可能有帮助
nm1 <- paste0("matrix", toupper(names(lst1)))
Map(crossprod, lst1, mget(nm1))
所以...我不确定我是否理解。但似乎如果列表有名称 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)
这可能不是最好的解决方案,但它很简单。我只是对你的 ideia 做了一些调整,所以它可以工作,一个矩阵需要在一个ifelse() 否则你只会得到第一个元素。这将为您 return 列出结果。
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 将序列应用于(1 到 zz 的长度)到定义的函数。对于每个 i 函数查看 i 元素的名称 zz (zz[i] returns 列表的元素及其名称),如果它满足条件,我们将 i 元素的内容与 zz 相乘( zz[[i]] 只是 returns 列表的 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 的回答更漂亮也更简短。
我有一个长度为 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)
可能有帮助
nm1 <- paste0("matrix", toupper(names(lst1)))
Map(crossprod, lst1, mget(nm1))
所以...我不确定我是否理解。但似乎如果列表有名称 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)
这可能不是最好的解决方案,但它很简单。我只是对你的 ideia 做了一些调整,所以它可以工作,一个矩阵需要在一个ifelse() 否则你只会得到第一个元素。这将为您 return 列出结果。
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 将序列应用于(1 到 zz 的长度)到定义的函数。对于每个 i 函数查看 i 元素的名称 zz (zz[i] returns 列表的元素及其名称),如果它满足条件,我们将 i 元素的内容与 zz 相乘( zz[[i]] 只是 returns 列表的 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 的回答更漂亮也更简短。