2017-03-05 5 views
1

Ich habe zwei Datenrahmen in R:Wie wird ein R-Datenrahmen mit den Werten eines anderen R-Datenrahmens verknüpft?

Died.At <- c(22,40,72,41, ...) 
Writer.At <- c(16, 18, 36, 36) 
Name <- c("John Doe", "Edgar Poe", "Walt Whitman", "Jane Austen", ...) 
Gender <- c("MALE", "MALE", "MALE", "FEMALE", ...) 
Date.Of.Death <- c("2015-05-10", "1849-10-07", "1892-03-26","1817-07-18", ...) 
Pet <- c("cat", "dog", "cat", "cat") 
df1 = data.frame(Died.At, Writer.At, Name, Gender, Pet) 
print(df1) 
    Died.At Writer.At  Name   Gender Pet 
1  22  16  John Doe  MALE  cat 
2  40  18  Edgar Poe  MALE  dog 
3  72  36  Walt Whitman MALE  cat 
4  41  36  Jane Austen FEMALE cat 
..... 

In df1 nicht jede Zeile für Name einzigartig ist (dh es gibt mehrere Zeilen mit demselben Autor sind.)

Der zweite Datenrahmen df2, gibt es auch eine Spalte Name mit beiden Autoren aus df1 (zB Jane Austen) und völlig neuen Autoren. Dieser Datenrahmen ist auch viel größer.

print(length(unique(df1$Name))) 
## output 1168 
print(length(unique(df2$Name))) 
## output 5572 

würde Ich mag df2, so dass die einzigen Namen die Namen von df1 sind die Teilmenge.

Meine Idee war es, dies zu tun:

subset_df2 = df2[df2$Name == unique(df1$Name)] 

aber ich würde erwarten, dass es 1168 einzigartige Autorennamen, hier zu sein:

print(length(unique(subset_df2$Name))) 
## output 880 

, die weniger ist, als ich es erwartet hatte. Wo ist mein Fehler?

+0

Es gibt Inkonsistenz in dieser Anweisung "Jeder Wert in der Spalte Name ist eindeutig. In df1 ist jedoch nicht jede Zeile eindeutig (d. H. Es gibt mehrere Zeilen mit demselben Autor)." Wenn jede Zeile in df1 nicht eindeutig ist und einige Zeilen denselben Autor haben, wie ist Name eindeutig, wenn df1 aus Name konstruiert wird. Auch in Ihrem Code haben Sie First.Name und Second.Name, aber sie erscheinen nicht in DF1? – Djork

+0

@ R.S. Ich habe das obige bearbeitet --- danke. – ShanZhengYang

+0

'subset_df2 <- Teilmenge (df2, Name% in% df1 $ Name)' – jdobres

Antwort

3

Sie können match(df2$Name, df1$Name) oder df2$Name %in% df1$Name verwenden, die einen Vektor von logicals mit der Länge von df2 $ Name und logisch TRUE zurückgeben, wobei df2 $ Name in df1 $ Name steht. Sie können dies dann verwenden, um df2 zu indexieren.

subset_df2 <- df2[df2$Name %in% df1$Name, ] 

Siehe ?match

Was, warum Ihr Code nicht funktioniert, bitte die Ausgabe dieser Übung sehen:

a = LETTERS[sample(1:10, size=15, replace=T)] 
b = c(unique(a), LETTERS[15:30]) 
# compare 
b == unique(a) 
b[b == unique(a)] 
# vs 
b %in% a 
b[b %in% a] 

Beachten Sie auch b %in% a ist nicht gleichbedeutend mit a %in% b und daher b[a %in% b] ergäbe ein falsches Ergebnis

Darüber hinaus müssen Sie beim Indizieren eines Datenrahmens einen Zeilenbereich und einen Spaltenbereich angeben.

+0

Was ist 'LETTERS' im obigen Code? – ShanZhengYang

+0

Es scheint keinen Unterschied zwischen 'subset_df2 = df2 [df2 $ Name% in% df1 $ Name]' und 'subset_df2 = df2 [df2 $ Name% in% df1 $ Name,]' zu geben. Ist das richtig? – ShanZhengYang

+0

Sie haben genau das gleiche in Ihren Kommentar eingegeben, aber wenn Sie 'match' und'% in% 'meinen, ja, sie sind gleich, siehe die Hilfedatei für'? Match' und unter Details wie% in% ist definiert als '"% in% "<- Funktion (x, Tabelle) Übereinstimmung (x, Tabelle, Nomatch = 0)> 0 '. 'Buchstaben 'oder' Buchstaben' sind in Konstanten in R, einem Vektor des Alphabets, eingebaut, siehe 'Buchstaben'. – Djork

Verwandte Themen