[英]Check length of matrix elements
mat <- structure(list(c(1, 2, 3, 4, 5), 2, c(3, 2, 1), numeric(0), numeric(0),
numeric(0), c(1, 2, 3, 6), c(1, 2, 3, 4, 5), 1, numeric(0),
numeric(0), numeric(0), c(3, 4, 2), 3, c(1, 2, 3, 4, 5),
numeric(0), numeric(0), numeric(0), numeric(0), numeric(0),
numeric(0), 1.358, numeric(0), numeric(0), numeric(0), numeric(0),
numeric(0), numeric(0), 0.0223257970827299, numeric(0), numeric(0),
numeric(0), numeric(0), numeric(0), numeric(0), 1.493), .Dim = c(6L,
6L))
> mat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] Numeric,5 Numeric,4 Numeric,3 Numeric,0 Numeric,0 Numeric,0
[2,] 2 Numeric,5 3 Numeric,0 Numeric,0 Numeric,0
[3,] Numeric,3 1 Numeric,5 Numeric,0 Numeric,0 Numeric,0
[4,] Numeric,0 Numeric,0 Numeric,0 1.358 Numeric,0 Numeric,0
[5,] Numeric,0 Numeric,0 Numeric,0 Numeric,0 0.0223258 Numeric,0
[6,] Numeric,0 Numeric,0 Numeric,0 Numeric,0 Numeric,0 1.493
我有一个6x6矩阵对象。 每个单元格都包含一个数值列表。 我想在mat
对象中找到索引i, j
,指示哪些单元格包含> 1但<5个元素长的向量。 换句话说,我希望看到指数:(1,2),(1,3)和(3,1)。
我已经尝试使用which(length(mat) < 5 & length(mat) > 1)
但这不起作用。
一个可能的解决方案是使用基数R的lengths
。由于有关于什么输出的各种评论,在这种情况下,这是我的细节,
sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
mat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] Numeric,5 Numeric,4 Numeric,3 Numeric,0 Numeric,0 Numeric,0
[2,] 2 Numeric,5 3 Numeric,0 Numeric,0 Numeric,0
[3,] Numeric,3 1 Numeric,5 Numeric,0 Numeric,0 Numeric,0
[4,] Numeric,0 Numeric,0 Numeric,0 1.358 Numeric,0 Numeric,0
[5,] Numeric,0 Numeric,0 Numeric,0 Numeric,0 0.0223258 Numeric,0
[6,] Numeric,0 Numeric,0 Numeric,0 Numeric,0 Numeric,0 1.493
str(mat)
List of 36
$ : num [1:5] 1 2 3 4 5
$ : num 2
$ : num [1:3] 3 2 1
$ : num(0)
$ : num(0)
$ : num(0)
$ : num [1:4] 1 2 3 6
$ : num [1:5] 1 2 3 4 5
$ : num 1
$ : num(0)
$ : num(0)
$ : num(0)
$ : num [1:3] 3 4 2
$ : num 3
$ : num [1:5] 1 2 3 4 5
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num 1.36
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num 0.0223
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num(0)
$ : num 1.49
- attr(*, "dim")= int [1:2] 6 6
然后,
m2 <- lengths(mat)
which(m2 < 5 & m2 > 1, arr.ind = TRUE)
# row col
#[1,] 3 1
#[2,] 1 2
#[3,] 1 3
如果您使用的是版本<3.4.1,那么两步法(如@lmo提出的那样)将起作用,即
m1 <- matrix(lengths(mat), 6)
which(m1 > 1 & m1 < 5, arr.ind=TRUE)
这是我的解决方案:
lMat <- apply(mat, 2, function(x) sapply(x, length))
which(lMat > 1 & lMat < 5, arr.ind = TRUE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.