2016-12-11 4 views
0

Ich bin neu in R, und ich habe 2-Datenrahmen wie folgt vor:Vergleich von zwei Datenrahmen in R

df1 
T_id U_id U_code score 
A_0_1 UHJKI XPOS_hp 134 
B_1_3 NBVFR LKJ_mm 543 
C_9_0 TRFDA NBV_lp 80 
D_9_1 KOIUA TRE_po 212 
E_0_1 SDFRQ QAS_np 300 
E_0_1 SDKIJ JIT_mx 160 
F_0_1 JKOPA TOZ_po 79 

df2 
T_id U_id U_code score 
A_0_1 UHJKI XPOS_hp 150 
B_1_3 NBVFR LKJ_mm 520 
C_9_0 TRFDG NBJ_po 90 
D_9_1 KOIUA TRE_po 250 
E_0_1 SDFRQ QAS_np 300 
E_0_1 SDKIJ JIT_mx 160 
F_0_1 LOLPO JUZ_ic 90 

Ich möchte die Punktzahl von DF1 und DF2 für diese Einträge in DF1 vergleichen, die genau hat die

df$1score=df2$score 
E_0_1 SDFRQ QAS_np 300 
E_0_1 SDKIJ JIT_mx 160 
df1$score > df2$score 
B_1_3 NBVFR LKJ_mm 543 
df1$score < df2$score 
A_0_1 UHJKI XPOS_hp 150 
D_9_1 KOIUA TRE_po 250 

auch würde ich die Einträge von DF1 mag speichern, für die keine Übereinstimmung in df2 gefunden

: gleiche T_id, U_id and U_code in DF2 und sie in drei Gruppen an den Bedingungen ( df1$score >df2$score, df1$score=df2$score, df$1score<df2score) wie folgt basieren klassifizieren
No matches 
C_9_0 TRFDA NBV_lp 80 
F_0_1 JKOPA TOZ_po 79 

Ich habe versucht, die folgenden R-Code

comparison=function(df1,df2) 
{ 
df1_equal_df2=NULL 
df1_greater_than_df2=NULL 
df1_smaller_than_df2=NULL 
no_match=NULL 
if(df$T_id==df2$T_id && df1$U_id == df2$U_id && df1$U_code==df2$U_code && df1$score > df2$score) 
{ 
    df1_greater_than_df2=df$T_id 
} 
else if(df$T_id==df2$T_id && df1$U_id == df2$U_id && df1$U_code==df2$U_code && df1$score < df2$score) 
{ 
    df1_smaller_than_df2=df1$id 
} 
else if(df$T_id==df2$T_id && df1$U_id == df2$U_id && df1$U_code==df2$U_code && df1$score = df2$score) 
    { 
    df1_equal_df2=df$1 
    } 
else 
    { 
    no_match=df$1 
    } 

} 

Aber die oben nicht funktioniert hat. Wie kann ich meine gewünschte Ausgabe erhalten? leite mich freundlicherweise

+2

Warum Ihre Daten zuerst nicht zusammenführen? Dann sind alle anderen Operationen einfach. – Heroka

Antwort

3

Wir tun dies dplyr mit:

library(dplyr) 
res <- df1 %>% left_join(df2, by=c("T_id","U_id","U_code")) %>% 
       mutate(comp=ifelse(score.x > score.y,"df1$score > df2$score",ifelse(score.x < score.y,"df1$score < df2$score","df1$score == df2$score"))) %>% 
       rename(score=score.x) %>% select(-score.y) 
## T_id U_id U_code score     comp 
##1 A_0_1 UHJKI XPOS_hp 134 df1$score < df2$score 
##2 B_1_3 NBVFR LKJ_mm 543 df1$score > df2$score 
##3 C_9_0 TRFDA NBV_lp 80     <NA> 
##4 D_9_1 KOIUA TRE_po 212 df1$score < df2$score 
##5 E_0_1 SDFRQ QAS_np 300 df1$score == df2$score 
##6 E_0_1 SDKIJ JIT_mx 160 df1$score == df2$score 
##7 F_0_1 JKOPA TOZ_po 79     <NA> 

Wir führen eine linke äußere Verknüpfung von df1 und df2 von T_id, U_id, and U_code. Dadurch werden die zwei Tabellen zusammengeführt, in denen score von df1score.x ist und score von df2 ist score.y. Verwenden Sie dann mutate, um die Spalte comp zu erstellen, die angibt, ob score.x größer als, kleiner als oder gleich score.y ist. Zum Schluss benennen wir die Spalte score.x in score um und entfernen die Spalte score.y, um das Ergebnis für die Präsentation sauberer zu machen.

Eine äquivalente Implementierung Basis-R verwendet, ist:

res <- merge(df1,df2,by=c("T_id","U_id","U_code"), all.x=TRUE) 
res$comp <- ifelse(res$score.x > res$score.y,"df1$score > df2$score",ifelse(res$score.x < res$score.y,"df1$score < df2$score","df1$score == df2$score")) 
res <- res[,c(1:4,6)] 
colnames(res) <- sub("score.x","score",colnames(res)) 

die das gleiche Ergebnis ergibt. Wenn Sie dann durch comp-split daraus resultierenden Datenrahmen wünschen:

split(res[,-5],res$comp) 
##$`df1$score < df2$score` 
## T_id U_id U_code score 
##1 A_0_1 UHJKI XPOS_hp 134 
##4 D_9_1 KOIUA TRE_po 212 
## 
##$`df1$score == df2$score` 
## T_id U_id U_code score 
##5 E_0_1 SDFRQ QAS_np 300 
##6 E_0_1 SDKIJ JIT_mx 160 
## 
##$`df1$score > df2$score` 
## T_id U_id U_code score 
##2 B_1_3 NBVFR LKJ_mm 543 
Verwandte Themen