2016-08-29 4 views
6

Prost, Ich habe zwei Datenrahmen mit der folgenden Struktur.Vergleichen Sie Spalten des Datenrahmens mit mehreren Bedingungen

DF1: 
Airlines   HeadQ  Date   Cost_Index 
American   PHX  07-31-2016  220 
American   ATL  08-31-2016  150 
American   ATL  10-31-2016  150 
Delta    ATL  10-31-2016  180 
American   ATL  08-31-2017  200 

zweiten Datenrahmen DF2 die folgende Struktur:

DF2: 
Airlines   HeadQ  Date   
American   ATL  09-30-2016 
Delta    ATL  03-31-2017 

Jetzt mit Datenrahmen DF1 und DF2 aufzuzublicken, würde Ich mag DF1 an folgendem Datenrahmen ändern.

DF1: 
Airlines   HeadQ  Date   Cost_Index 
American   PHX  07-31-2016  220 
American   ATL  08-31-2016  0 
American   ATL  10-31-2016  150 
Delta    ATL  10-31-2016  180 
American   ATL  08-31-2017  200 

Die Bedingung ist, Lookup für Airlines und HEADQ von DF1 von DF2 und DF1 wenn $ Date < DF2 $ Date dann mit Cost_Index Cost_Index als 0 oder auch weiterhin machen.

Ich versuchte vergeblich, mit:

DF1$Cost_Index <- ifelse(DF1$Airlines == DF2$Airlines & DF1$HeadQ == DF2$HeadQ 
     & DF1$Date < DF2$Date, 0, DF1$Cost_Index) 


Warning: 
1: In DF1$Airlines == DF2$Airlines : longer object 
length is not a multiple of shorter object length". 
2: In<=.default(DF1$Date, DF2$Date) : longer object length is not a 
multiple of shorter object length 

DF1: 
Airlines   HeadQ  Date   Cost_Index 
American   PHX  07-31-2016  220 
American   ATL  08-31-2016  0 
American   ATL  10-31-2016  0 
Delta    ATL  10-31-2016  0 
American   ATL  08-31-2017  200 

jemand mir richtige Richtung zeigen kann?

Hinweis:

str(DF1$Date): Date, format: "2016-10-31" 
str(DF2$Date): Date, format: "2016-08-31" 
+0

, wenn Probleme im Zusammenhang mit Daten präsentiert, die seine hat Daten wirklich Am besten stellen Sie uns Ihre Originaldaten zur Verfügung, damit wir wissen, mit was Sie arbeiten. Können Sie das liefern? Oder zumindest '' str (DF1) '' –

+0

Gerade hinzugefügt die Struktur der Datenrahmen: @Cyrus Mohammadian –

+0

erhalten Sie einen Fehler? Wenn nicht, was hat Ihr Code hervorgebracht? –

Antwort

14

Mit der bedingten Funktion (seit 1.9.8) beitritt, würde ich dies tun, wie folgt:

require(data.table) # v1.9.8+ 
# convert to data.tables, and Date column to Date class. 
setDT(df1)[, Date := as.Date(Date, format = "%m-%d-%Y")] 
setDT(df2)[, Date := as.Date(Date, format = "%m-%d-%Y")] 

df1[df2, on = .(Airlines, HeadQ, Date < Date), # find matching rows based on condition 
     Cost_Index := 0L]      # update column with 0 for those rows 

df1 
# Airlines HeadQ  Date Cost_Index 
# 1: American PHX 2016-07-31  220 
# 2: American ATL 2016-08-31   0 
# 3: American ATL 2016-10-31  150 
# 4: Delta ATL 2016-10-31  180 
+0

Warum "DF1 $ Cost_Index2 <-ifelse (DF1 $ Airlines == DF2 $ Airlines & DF1 $ HeadQ == DF1 $ HeadQ & DF1 $ Datum

+1

Ich bin nicht der größte Fan von 'ifelse', aber nur laufen, zum Beispiel,' DF1 $ Airlines == DF2 $ Airlines' sehen, was es gibt .. Hinweis: Recycling. Sie können hier nicht einfach zwei gleiche/ungleiche Vektoren gleichsetzen. Für jede Zeile in 'DF2' müssen Sie alle übereinstimmenden Zeilen in' DF1' erhalten. – Arun

+0

ahhh! Ok, ich sehe in diesem Fall, wie wäre es mit diesem Ansatz: "DF1 $ Cost_Index [DF1 $ Fluggesellschaften == DF2 $ Airlines & DF1 $ HeadQ == DF2 $ HeadQ & DF1 $ Datum

Verwandte Themen