2016-04-09 14 views
0

Ich habe eine Liste von Matrizen (2 Zeilen und unterschiedliche Anzahl von Spalten in jeder Matrix). Die erste Zeile in jeder Matrix ist hier von Interesse. Ich möchte einen effizienten Weg finden, die Spalte in jedem Element der Liste zu finden, die einen bestimmten Wert annimmt. Die erste Zeile jedes Elements der Liste enthält alle eindeutigen Werte. Betrachten Sie die Beispielliste unten.Suchen Sie alle Indizes einer Zahl in einer Liste in R

> 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 

Wenn ich will, um die Vorkommen der Zahl „3“ in der ersten Reihe jedes Element der Liste zu finden, wird das zurückgegebene Objekt aussehen,

> index <- matrix(c(1, 2, 3, 2, 3, 0), ncol = 2) 
> index 
    [,1] [,2] 
[1,] 1 2 
[2,] 2 3 
[3,] 3 0 

wo die Ausgangsmatrix sagt, dass "3" in dem ersten Element in Spalte 2, in dem zweiten Element in Spalte 3 auftritt und nicht in dem dritten Element auftritt.

Ich kann eine doppelte for-Schleife verwenden, ich hatte gehofft, es gibt einen effizienteren Weg.

Antwort

3

Dies gilt nur which() über die Liste, in der ersten Zeile jedes Elements, und gibt eine Null, wenn das Ergebnis keine Länge hat (ist integer(0)). Dann binden wir das an eine Sequenz der Länge von s (oder die Länge von example, dasselbe).

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 
Verwandte Themen