2017-03-10 8 views
1

Ich habe drei Datenrahmen df1, df2, df3. Ich möchte den Wert (die Werte) in col1 von df2, der in col1 von df1 und/oder col1 von df3 nicht vorhanden ist, identifizieren.Extrahiere die Teilmenge eines Datenrahmens basierend auf Werten, die von anderen zwei Datenrahmen eindeutig sind.

df1 <- data.frame(col1=c('A','C','E'),col2=c(4,8,2)) 
df1 

df2 <- data.frame(col1=c('A','B','C','E','G','I'),col2=c(4,8,2,6,1,9)) 
df2 

df3 <- data.frame(col1=LETTERS[3:26],col2=sample(3:26)) 
df3 

# Expected output 
#2 B 8 

Was habe ich getan?

table(df2$col1 %in% df1$col1) 
# FALSE TRUE 
# 3  3 

df2[df2$col1 %in% df1$col1,] 
# col1 col2 
#1 A 4 
#3 C 2 
#4 E 6 

df2[!df2$col1 %in% df1$col1,] 
# col1 col2 
#2 B 8 
#5 G 1 
#6 I 9 

table(df2$col1 %in% df3$col1) 
#FALSE TRUE 
# 2  4 

df2[df2$col1 %in% df3$col1,] 
# col1 col2 
#3 C 2 
#4 E 6 
#5 G 1 
#6 I 9 

df2[!df2$col1 %in% df3$col1,] 
# col1 col2 
#1 A 4 
#2 B 8 

In einem falschen Ansatz,

df2[!df2$col1[!df2$col1 %in% df1$col1] %in% df3$col1,] 
# col1 col2 
#1 A 4 
#4 E 6 

Wie die Wiederholung der Indizes zu vermeiden?

Gibt es einen besseren Ansatz als die folgenden?

df2[!df2$col1 %in% df1$col1,][!df2$col1[!df2$col1 %in% df1$col1] %in% df3$col1,] 
# col1 col2 
#2 B 8 

Während der richtige Ansatz,

df2[!(df2$col1 %in% df1$col1 | df2$col1 %in% df3$col1),] 
# col1 col2 
#2 B 8 
+0

Sie verwenden können, verwenden können 'anti_join' oder' setdiff' von 'dplyr' – akrun

+0

meinst du' anti_join (anti_join (df2, df1, durch = 'col1'), df3, by = 'col1') '? – Prradep

Antwort

2

Wir anti_join

library(dplyr) 
bind_rows(df1, df3) %>% 
      anti_join(df2, ., by = "col1") 
# col1 col2 
#1 B 8 
Verwandte Themen