2016-11-25 3 views
0

Ich habe 3 Datenrahmen. Einer enthält die ganze Reihe von Zahlen. Zweiter und dritter Datenrahmen enthalten Teilmengen dieser Nummern mit einer bestimmten Eigenschaft (Typ 1 oder Typ 2). Was ich tun möchte, ist, diese Datenrahmen zu einem zusammenzufassen, so dass jede Zahl geprüft wird, ob sie ein oder zwei ist.Etikettenwerte, die mit Werten aus anderen Datenrahmen übereinstimmen

Beispiel:

numbers <- c("+333","+334", "+335", "+443", "+444", "+445", "+553", "+554", "+555") 
typeone <- c("+333","+334", "+335", "+443") 
typetwo <- c("+335", "+443", "+444", "+445") 
fs <- data.frame(numbers)   
to<- data.frame(typeone) 
tt<- data.frame(typetwo) 

Gewünschtes Ergebnis nach dem Zusammenführen fs, to und tt:

numbers typeone typetwo 
1 333   yes 
2 334   yes 
3 335   yes  yes 
4 443   yes  yes 
5 444     yes 
6 445     yes 
7 553  
8 554  
9 555  

Antwort

2

Try this:

data.frame(numbers = numbers, 
       typeone = numbers %in% typeone, 
       typetwo = numbers %in% typetwo) 

Dann können Sie neue logische Spalten ändern, wie Sie wollen .

+0

Vielleicht: 'data.frame (Zahlen = Zahlen, typeone = ifelse (Zahlen % in% typeone, "ja", ""), typewo = ifelse (Zahlen% in% typezwei, "ja", "")) ' –

+1

Ja, es ist die einfachste Lösung, aber ich sehe keine Vorteile zu verwenden Binärzeichenfolge über logisch. Also habe ich es dem OP überlassen. –

+0

@AndreyKolyadin Sie haben Recht, und dies wird auch einfacher für den Benutzer zu Subset (in benötigt) oder indizieren Sie es später, ohne es wieder in logisch zu konvertieren, wenn Sie durch die "Ja", "" Route wie von jemandem vorgeschlagen. Außerdem kann die Verwendung von 'ifelse' den Prozess unnötig verlangsamen. – akrun

2

Sie können eine sequenzielle Zusammenführung versuchen. Um schöne Namen von Spalten zu erhalten, könnten Sie die Namen in names(to) <- c("numbers", "typeone") und ähnlich für tt ändern.

to$mhm <- "yes" 
tt$mhm <- "yes" 

out <- merge(fs, to, by.x = "numbers", by.y = "typeone", all.x = TRUE) 
merge(out, tt, by.x = "numbers", by.y = "typetwo", all.x = TRUE) 

    numbers mhm.x mhm.y 
1 +333 yes <NA> 
2 +334 yes <NA> 
3 +335 yes yes 
4 +443 yes yes 
5 +444 <NA> yes 
6 +445 <NA> yes 
7 +553 <NA> <NA> 
8 +554 <NA> <NA> 
9 +555 <NA> <NA> 

Oder legen Sie die Datensätze in einer list, die gleichen Spaltennamen gesetzt, und verwenden Sie Reduce mit merge

Reduce(function(...) merge(..., by= "numbers", all.x=TRUE), 
     list(fs, setNames(to, "numbers"), setNames(tt, "numbers"))) 
+0

@akrun Fühlen Sie sich frei, meine Frage zu verbessern, indem Sie diese in. –

Verwandte Themen