2016-09-01 6 views
1

Ich möchte zwei Datenrahmen zusammenführen: X mit Länge 10 (zum Beispiel) und Y mit Länge 3, aber mit ähnlichen Zeilennamen. Ich möchte nur die Länge von X beibehalten, aber mit den Werten von B in den 3 entsprechenden Zeilen und den anderen 10 - 3 = 7 Werten auf Null gesetzt.Zusammenführen von Datenrahmen unter Beibehaltung der Länge von eins und Werten von anderen in R

Zum Beispiel

X<-data.frame(c(1,2,3,4,5,6,7,8,9,10)) 
rownames(X)<-c("a","b","c","d","e","f","g","h","i","j") 
Y<-data.frame(c(20,30,40)) 
rownames(Y)<-c("d","f","h") 

gibt mir diesen Datenrahmen

X    Y 
a 1   d 20 
b 2   f 30 
c 3   h 40 
d 4 
e 5 
f 6 
g 7 
h 8 
i 9 
j 10 

und ich möchte die jetzt

Z    
a 0   
b 0   
c 0   
d 20 
e 0 
f 30 
g 0 
h 40 
i 0 
j 0 

kann dies leicht getan werden?

Antwort

1

Wir match verwenden, um die Positionen der Reihe Namen von Y zu finden, die in X. Die Werte von Y gefunden werden, werden in einen Vektor gesetzt und verkettet mit 0. Wir verwenden das nomatch Argument 0 zu füllen, wenn es keine Übereinstimmung. Dies gibt z als Vektor:

Z <- c(unlist(Y, use.names=FALSE), 0)[match(row.names(X), row.names(Y), nomatch=4L)] 
Z 
[1] 0 0 0 20 0 30 0 40 0 0 

Um eine data.frame zu bekommen

Z <- data.frame(Z) 
+0

Danke, das sieht schon vielversprechend aus. Was macht das 4L genau? – User23

+0

4L ist 4 als Ganzzahl. Wenn Sie 4 alleine verwenden, handelt es sich um eine Zahl (doppelt). Dies stellt sicher, dass der Index richtig zugewiesen ist. – lmo

1

dplyr für left_join nette Option. Code davon ist es einfach zu lesen und zu erklären.

X<-data.frame(V1 = c(1,2,3,4,5,6,7,8,9,10), 
       KEY = c("a","b","c","d","e","f","g","h","i","j"), 
       stringsAsFactors = F) 


Y<-data.frame(V2 = c(20,30,40), 
       KEY = c("d","f","h"), 
       stringsAsFactors = F) 

library(dplyr) 

XandY <- X %>% 
    left_join(Y, by = "KEY") %>% 
    mutate(Z = ifelse(is.na(V2), 0, V2)) 

Ich schlug alle Spalten in XandY, um Ihnen alle Berechnungen und Ergebnisse zu zeigen.

> XandY 

    V1 KEY V2 Z 
1 1 a NA 0 
2 2 b NA 0 
3 3 c NA 0 
4 4 d 20 20 
5 5 e NA 0 
6 6 f 30 30 
7 7 g NA 0 
8 8 h 40 40 
9 9 i NA 0 
10 10 j NA 0 
Verwandte Themen