2017-12-28 19 views
0

Ich habe zwei Datenrahmen:generieren Spalte, wenn andere Spalten gleich sind

df1 <- data.frame('ID'=c(1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10), 
       'invoice'=c(24000, 21000, 25000, 21000, 26000, 27000, 
       28000, 29000, 30000, 31000, 21000, 32000, 33000), 
       'settle'=c(40000, 40000, 41000, 41000, 42000, 43000, 44000, 
       45000, 46000, 47000, 47000, 48000, 49000), 
       'amount'=c(10, 10, 20, 10, 30, 10, 20, 30, 10, 20, 
       10, 30, 10), 
       'reason'=c(4, 5, 5, 5, 9, 4, 5, 9, 4, 5, 5, 15, 8)) 

Und:

df2 <- data.frame('ID'=c(1, 2, 2, 4, 5, 7, 8, 11, 12), 
       'invoice'=c(40000, 41000, 39000, 43000, 44000, 46000, 
       47000, 40000, 41000), 
       'settle'=c(24000, 25000, 21000, 27000, 28000, 30000, 
       31000, 24000, 25000), 
       'amount'=c(10, 20, 20, 10, 20, 10, 20, 10, 10), 
       'reason'=c(4, 5, 5, 4, 5, 4, 5, 4, 4)) 

df1:

ID invoice settle amount reason 
1 24000 40000  10  4 
1 21000 40000  10  5 
2 25000 41000  20  5 
2 21000 41000  10  5 
3 26000 42000  30  9 
4 27000 43000  10  4 
5 28000 44000  20  5 
6 29000 45000  30  9 
7 30000 46000  10  4 
8 31000 47000  20  5 
8 21000 47000  10  5 
9 32000 48000  30  15 
10 33000 49000  10  8 

df2:

ID invoice settle amount reason 
1 40000 24000  10  4 
2 41000 25000  20  5 
2 39000 21000  20  5 
4 43000 27000  10  4 
5 44000 28000  20  5 
7 46000 30000  10  4 
8 47000 31000  20  5 
11 40000 24000  10  4 
12 41000 25000  10  4 

So würde Ich mag ein Dummy-Variable in df1 von den folgenden Bedingungen generieren:

if df1$ID == df2$ID 
if df1$settle == df2$invoice 
if df1$amount == df2$amount 
if df1$reason == df2$reason 

Also, wenn die Bedingungen erfüllt sind, soll meine neue Spalte gleich 1 sein, sonst 0.

df1 mit den neuen variablen würde wie folgt aussehen:

ID invoice settle amount reason newvar 
1 24000 40000  10  4  1 
1 21000 40000  10  5  0 
2 25000 41000  20  5  1 
2 21000 41000  10  5  0 
3 26000 42000  30  9  0 
4 27000 43000  10  4  1 
5 28000 44000  20  5  1 
6 29000 45000  30  9  0 
7 30000 46000  10  4  1 
8 31000 47000  20  5  1 
8 21000 47000  10  5  0 
9 32000 48000  30  15  0 
10 33000 49000  10  8  0 

ich habe versucht:

df1$newvar <- ifelse(df1$ID == df2$ID & 
         df1$settle == df2$invoice & 
         df1$amount == df2$amount & 
         df1$reason == df2$reason, 1, 0) 

erhalte ich die Warnmeldung:

"longer object length is not a multiple of shorter object length" 

So gues ich ein ifelse nicht möglich ist, da meine beiden Datenrahmen nicht von der gleichen Größe sind (mehr IDs in df1 als in DF2).

Können Sie mir helfen, dieses Problem zu lösen?

In SPSS oder Stata würde ich nur den IF-Befehl verwenden, aber R ist ziemlich neu für mich!

EDIT

Ich habe meine Testdatenrahmen geändert, so dass sie mehr ähnlich denen sind mit denen ich arbeite. Ich habe auch eine Ansicht von df1 mit der neuen Variable hinzugefügt.

+0

Vielleicht brauchen Sie '% in%' statt '==' – akrun

+0

Mit den gegebenen Testdaten, erwarten Sie nur 0s? – Dennis

+0

@Dennis: Nein, ich habe eine Ansicht von df1 hinzugefügt, so wie ich möchte, dass die neue Variable in meinen Testdaten endet. –

Antwort

1

Der Fehler liegt daran, dass Ihre beiden Datenrahmen unterschiedliche Anzahl von Zeilen haben.

versuchen Sie zuerst beide Tabellen nach den Kriterien zu verbinden und dann Ihre neue Spalte auf df1.

df1<-left_join(df1,df2,by=c("ID"="ID","settle"="invoice","amount"="amount","reason"="reason")) 
df1<-df1 %>% mutate(newvar=ifelse(is.na(settle.y),0,1)) %>% 
      select(-settle.y) 
+0

Er möchte eine Verbindung über alle Spalten machen ... – Dennis

+0

Das funktioniert perfekt! –

+0

hmm funktioniert nur mit den Testdaten, nicht mit meinen echten Daten ... Ich werde zurückkommen, wenn ich weiß, was der Unterschied ist. Der linke Join funktioniert nicht –

Verwandte Themen