我有一个矩阵列表(每个矩阵中有2行和不同的列数)。每个矩阵中的第一行在这里是有意义的。我想要一种有效的方法,在列表的每个元素中找到列,其中包含一定的值。列表中每个元素的第一行都具有所有唯一值。请考虑下面的示例列表。
> example <- list(matrix(1:6, nrow = 2), matrix(c(1,5,6,4,3,6,4,6,7,9), nrow = 2), matrix(c(1,7,5,9), nrow = 2))
> example
[[1]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 3 4 7
[2,] 5 4 6 6 9
[[3]]
[,1] [,2]
[1,] 1 5
[2,] 7 9
如果我想在列表的每个元素的第一行中找到数字"3“的出现,返回的对象将如下所示,
> index <- matrix(c(1, 2, 3, 2, 3, 0), ncol = 2)
> index
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 0
在输出矩阵中," 3“出现在第2列的第1元素中,在第3列的第2元素中,而在第3元素中不出现。
我可以使用双for循环,我希望有一个更有效的方法。
发布于 2016-04-09 14:52:58
这只是在每个元素的第一行上对列表应用which()
,如果结果没有长度(is integer(0)
),则为零。然后我们将其绑定到一个序列,即s
的长度(或example
的长度,相同的东西)。
s <- lapply(example, function(x) {
if(!length(w <- which(x[1,] == 3))) 0 else w
})
cbind(seq_along(s), unlist(s))
# [,1] [,2]
# [1,] 1 2
# [2,] 2 3
# [3,] 3 0
https://stackoverflow.com/questions/36523534
复制