2016-06-10 5 views
1

Ich kämpfe, um zwei Matrizen ungleicher Länge zu kombinieren, die sich über denselben (oder ähnlichen) Zeitrahmen erstrecken. Ich möchte die Informationen der zwei Matrizen in eine Matrix gemäß der Zeitdimension zusammenführen, wobei Nullen in die Zeilen gefüllt werden, in denen die Information der zweiten Matrix fehlt.R: Kombinieren zweier Matrizen/Vektoren ungleicher Länge, übereinstimmende Zeilen nach den gleichen Werten

Im folgenden Beispiel habe ich eine 5x2 und 3x1 Matrizen mit Rownames gleich der entsprechenden Zeit.

Eingang 1

    [,1] [,2] 
20160518 15:31:00 1 1 
20160518 15:32:00 2 1 
20160518 15:33:00 3 1 
20160518 15:34:00 4 1 
20160518 15:35:00 5 1 

Eingang 2

    [,1]      
20160518 15:31:00 100 
20160518 15:34:00 101 
20160518 15:35:00 102 

Wunschergebnis

    [,1] [,2] [,3] 
20160518 15:31:00 1 1 100 
20160518 15:32:00 2 1 0 
20160518 15:33:00 3 1 0 
20160518 15:34:00 4 1 101 
20160518 15:35:00 5 1 102 

Zweite Frage wäre sehr ähnlich sein. Jetzt bin ich daran interessiert, nach übereinstimmenden Werten in einer Vektorreihe zu suchen, anstatt nach übereinstimmenden Rownames zu suchen. I.e. Stellen Sie sich vor, die rownames sind eine separate Spalte einer gegebenen Matrix (also habe ich eine 5x3 und 3x2 Matrizen) und ich möchte sie nach derselben Logik wie oben zu einer kombinieren.

Ich würde Ihre Hilfe wirklich schätzen. Ich habe viele Stunden gesucht, um die Lösung zu finden. Ich habe alle möglichen Befehle zum Zusammenführen, Cbind und Dplr Package ausprobiert. Ich vermisse wahrscheinlich ein kleines bisschen, aber ich kann es nicht herausfinden. Die Themen, die am nächsten kam, ist (aber ich kann es immer noch nicht zu meinem Problem zuzuschneiden):

combining two data frames of different lengths

Best, P.

Antwort

0

Wenn Ihr rownames sind porperly Satz, einzigartig, und so weiter .. . Sie tun können:

input3 <- input2[rownames (input1),] # reorder input2 as input1 
missing <- is.na (input3[,1])  # find the missing values 
input3[missing,1] <- 0    # replace by 1 
cbind (input1, input3)    # combine 

Ihre zweite Fragen in Bezug können Sie immer die Spalten verwenden Sie Zeilennamen umbenennen möchten ... (verwenden paste, wenn Sie mehrere Spalten als eindeutige Kennungen Ihrer Zeilen verwenden müssen)

Alternativ zur obigen Lösung können Sie data.frames anstelle von Matrizen verwenden und dann Zeilennamen als Zeichenspalten angeben. Dann könnten Sie Funktionen wie merge oder dplyr::full_join verwenden können.

+0

Vielen Dank für Ihre Hilfe – pun11

0

Meiner Meinung nach sollten Sie mit Datenrahmen nicht Matrizen arbeiten. Matrizen sollen mit numerischen Daten verwendet werden, während Sie hier eine Mischung aus numerischen und kategorischen Daten haben.

> x <- cbind(t=rownames(x), as.data.frame(unname(x))) 
> y <- cbind(t=rownames(y), as.data.frame(unname(y))) 
> xy <- merge(x, y, by='t', all=TRUE) 
> xy[is.na(xy)] <- 0 
> xy 
        t V1.x V2 V1.y 
1 20160518 15:31:00 1 1 100 
2 20160518 15:32:00 2 1 0 
3 20160518 15:33:00 3 1 0 
4 20160518 15:34:00 4 1 101 
5 20160518 15:35:00 5 1 102 

Dann, wenn Sie wirklich das Ergebnis in Form einer Matrix möchten, können Sie as.matrix(xy[-1]) tun.

Die Daten:

x <- structure(c(1L, 2L, 3L, 4L, 5L, 1L, 1L, 1L, 1L, 1L), 
       .Dim = c(5L, 2L), 
       .Dimnames = list(c("20160518 15:31:00", 
            "20160518 15:32:00", 
            "20160518 15:33:00", 
            "20160518 15:34:00", 
            "20160518 15:35:00"), NULL)) 

y <- structure(100:102, .Dim = c(3L, 1L), 
       .Dimnames = list(c("20160518 15:31:00", 
            "20160518 15:34:00", 
            "20160518 15:35:00"), NULL)) 
+0

Vielen Dank für Ihre Hilfe – pun11

Verwandte Themen