2017-12-13 1 views
0

ich zwei Datenrahmen haben:Suche schneiden zwischen Datenrahmen Spalten und einem zweiten Datenrahmen

Datenrahmen A

v1 v2 v3 
1 wn123 wrr002 tee893 
2 ms567 NA NA 
3 NA sud3003 wrt2229 
4 wrs92929 wrw036 syc3647 

Datenrahmen B

ID TN 
1 ms567 
2 sud3003 
3 syc3647 
4 wn123 
5 wrr002 
6 wrs92929 
7 wrt2229 
8 wrw036 

Ich mag kommt es zu Überschneidungen zwischen den drei Spalten finden (pro Zeile, dass alle Elemente pro Zeile in den Spalten v1, v2 und v3) des Datenrahmens A und der gesamten Spalte des Datenrahmens B $ x.

Die gewünschte Ausgabe als neue Datenrahmen C ist wie folgt:

v1 v2  
wn123 wrr002 
ms567 NA 
sud3003 wrt2229 
syc3647 wrw036 syc3647 

ich den Code so zu schreiben versucht:

getIntersect <- function(x,y){ 
return(intersect(x,y)) 
} 

data.frame(apply(A[v1:v3],2, function(x){getIntersect(x,B$TN)})) 

Der Code hat nicht funktioniert. Irgendwelche Vorschläge, wie man diesen Code funktioniert, bitte?

+0

ich nicht bekommen Ihr:

Dies kann durch rehaping von weiten zu langen Format melt(), Fügen im Langformat und Umformen wieder auf Wide-Format mit dcast() gelöst werden Ausgabe. Warum sind nur zwei Variablen darin? Sie können tun, was Sie wollen mit 'lapply (df, function (x) schneiden (x, df2 $ TN))'. – LAP

+0

Danke für das @ LAP. Ich habe die Ausgabe jetzt korrigiert. Ich war in der Lage, die richtige Ausgabe ohne Datenrahmen mit diesem zu erhalten: apply (A [1: 3], 1, Funktion (x) schneiden (x, B $ x)). Aber ich habe Fehler damit: data.frame (apply (A [1: 3], 1, Funktion (x) schneiden (x, B $ x)), na.strings = c ("", "NA")) wie folgt: ... Fehler in (function (..., row.names = NULL, check.rows = FALSCH, check.names = TRUE,: Argumente implizieren unterschiedliche Anzahl von Zeilen: 2, 1, 3 –

+0

I ' Ich bin nicht sicher, ob die gewünschte Ausgabe korrekt ist. 'wrs92929' in Zeile 4 von' A' steht auch in 'B'. – Uwe

Antwort

2

Soweit ich die Frage verstanden habe, möchte das OP nur diejenigen Einträge in A, die in B erscheinen.

library(data.table) 
setDT(B)[melt(setDT(A)[, rn := .I], id.vars = "rn"), on = .(TN = value), nomatch = 0L][ 
    , dcast(.SD, rn ~ rowid(rn, prefix = "V"), value.var = "TN")] 
rn  V1  V2  V3 
1: 1 wn123 wrr002  NA 
2: 2 ms567  NA  NA 
3: 3 sud3003 wrt2229  NA 
4: 4 wrs92929 wrw036 syc3647 
+0

Danke für Ihren Code @Uwe. Es funktioniert wie erwartet. Sehr geschätzt! –

Verwandte Themen