2017-07-17 96 views
2
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)但沒有奏效。

+2

FWIW'長度(墊)'給你的長度 –

+0

所以我想只是'這(長度(墊的一個簡單的載體)<5的長度(墊)> 1, arr.ind = TRUE)' – Sotos

+2

@Sotos'長度'只會返回一個向量。這兩行將起作用:'lMat < - 矩陣(長度(mat),6)'然後'哪個(lMat> 1&lMat <5,arr.ind = TRUE)'。 – lmo

回答

5

一個可能的解決方案是使用lengths從基地R.由於有什麼在這種情況下,這裏有我的詳細信息輸出什麼各種評論,

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) 
+1

美麗,謝謝! – Adrian

2

這裏是我的解決方案:

lMat <- apply(mat, 2, function(x) sapply(x, length)) 
which(lMat > 1 & lMat < 5, arr.ind = TRUE)