2017-03-07 5 views
3

Ich habe die folgenden Matrizen:Werte der Matrix mit einem Vektor subsetting (Bedingungen)

> matrix <- matrix(c(1,3,4,NA,NA,NA,3,0,4,6,0,NA,2,NA,NA,2,0,1,0,0), nrow=5,ncol=4) 
> n <- matrix(c(1,2,5,6,2),nrow=5,ncol=1) 

Wie Sie, für jede Zeilen sehen kann ich

  1. mehrere NAs haben - die Zahl NAs ist nicht definiert
  2. ONE Single "0"

ich möchte die 0 für die Werte der n der Teilmenge. Beabsichtigte Ausgabe unten.

> output <- matrix(c(1, 3, 4,NA,NA,NA,3,5,4,6,1,NA,2,NA,NA,2,2,1,6,2), nrow=5,ncol=4) 

Ich habe versucht, die folgenden

subset <- matrix == 0 & !is.na(matrix) 
matrix[subset] <- n 
#does not give intended output, but subset locates the values i want to change 

Wenn auf meinem "echten" Daten verwendet erhalte ich die folgende Meldung:

Warnmeldung: In m [Subset] < - n : Anzahl der zu ersetzenden Artikel ist nicht ein Vielfaches der Ersatzlänge

Danke

BEARBEITEN: eine Reihe der Matrix hinzugefügt, wie mein wirkliches Leben Problem mit einer unsymmetrischen Matrix ist. Ich benutze Matrizen und nicht DF hier, weil ich denke (nicht sicher), dass mit sehr großen Datensätzen R schneller ist mit großen Matrizen als Teilmengen von Datenrahmen.

Antwort

1

Wir können dies tun mit

out1 <- matrix+n[row(matrix)]*(matrix==0) 
identical(output, out1) 
#[1] TRUE 
+1

Danke, das funktioniert in meinem "skalierten" Beispiel. war auf der Suche nach diesem – Chrisftw

1

Es scheint, dass Sie die Werte nach Zeile ersetzen möchten, aber Subsetting ersetzt die Werte durch Spalte (und das ist vielleicht keine vollständig gründliche Erklärung). Transponieren der Matrix wird die gewünschte Ausgabe erhalten:

matrix <- t(matrix) 
subset <- matrix == 0 & !is.na(matrix) 
matrix[subset] <- n 
matrix <- t(matrix) 

setequal(output, matrix) 
[1] TRUE 
+0

Dank für Dies funktioniert nach dem von mir bereitgestellten Beispiel. Ich habe meine Frage bearbeitet, da meine realen Daten keine ausgewogene Matrix sind. Prost für Ihre Antwort – Chrisftw

1

Sie diese Option, können versuchen, mit ifelse:

ifelse(matrix == 0, c(n) * (matrix == 0), matrix) 

#  [,1] [,2] [,3] [,4] 
#[1,] 1 NA 1 2 
#[2,] 3 NA NA 2 
#[3,] 4 3 5 NA 
#[4,] NA 6 NA 2 

zero = matrix == 0 
identical(ifelse(zero, c(n) * zero, matrix), output) 
# [1] TRUE 
Verwandte Themen