2015-09-17 8 views
7

Ich bin sehr überrascht, diese Frage wurde nicht gestellt, vielleicht wird die Antwort warum klären. Ich möchte Zeilen einer Matrix mit einem Vektor vergleichen und zurückgeben, ob die Zeile == der Vektor überall ist. Siehe das Beispiel unten. Ich möchte eine vektorisierte Lösung, keine Anwendungsfunktionen, da die Matrix zu groß für eine langsame Schleife ist. Angenommen, es gibt auch viele Zeilen, deshalb möchte ich vermeiden, den Vektor neu zu bilden.überprüfen, ob Matrix Zeilen gleich einem Vektor in R, vektorisiert

set.seed(1) 

M = matrix(rpois(50,5),5,10) 

v = c(3 , 2 , 7 , 7 , 4 , 4 , 7 , 4 , 5, 6) 

M 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 4 8 3 5 9 4 5 6 7  7 
[2,] 4 9 3 6 3 1 5 7 6  1 
[3,] 5 6 6 11 6 4 5 2 7  5 
[4,] 8 6 4 4 3 8 3 6 5  6 
[5,] 3 2 7 7 4 4 7 4 5  6 

Ausgabe sollte

FALSE FALSE FALSE FALSE TRUE 

Antwort

7

Eine Möglichkeit ist

rowSums(M == v[col(M)]) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

Oder simlarly

rowSums(M == rep(v, each = nrow(M))) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

Oder

colSums(t(M) == v) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

v[col(M)] ist nur eine kürzere Version rep(v, each = nrow(M)) dem ein Vektor, der die gleiche Größe wie M erzeugt (Matrix nur ein Vektor ist, versuchen c(M)) und vergleicht dann jedes Element gegenüber den entsprechenden == verwenden. Zum Glück ist == eine generische Funktion, die eine array Methode hat (siehe methods("Ops") und is.array(M)), die wir rowSums (oder colSums) darauf, um laufen zu lassen, um sorgt dafür, dass wir die Menge der Spiele als ncol(M)

+0

Ich hatte gehofft, rep zu vermeiden, mit(), weil M eine sehr sehr große Matrix ist, so ein anderer für diese einfache logische Aufgabe zu machen beschwerlich sein wird. – robertevansanders

+1

Ist 'colSums (t (M) == v) == ncol (M)' besser? Es ist nicht so "* einfache logische Aufgabe *" btw –

+0

Ja Das ist großartig. – robertevansanders

4

Mit DeMorgans der Regel haben (nicht = alle andere nicht), dann alle gleich = nicht Einige nicht gleich, wir haben auch

!colSums(t(M) != v) 
0

Das Paket prodlim eine Funktion namens row.match, die einfach zu bedienen und ideal für Ihr Problem. Installieren und laden Sie zuerst die Bibliothek: library(prodlim). In unserem Beispiel gibt row.match '5' zurück, weil die 5. Zeile in M gleich v ist. Wir können dies dann in einen logischen Vektor umwandeln.

m <- row.match(v, M) 
m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE TRUE 
Verwandte Themen