2016-08-29 19 views
6

Pozdrowienia, Mam dwie ramki danych o następującej strukturze.Dopasowywanie i zastępowanie kolumn ramki danych według wielu warunków

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 

Druga ramka danych DF2 posiada następującą strukturę:

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

Teraz patrząc z danych ramek DF1 i DF2, chciałbym zmienić DF1 do kolejnej ramki danych.

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 

Warunkiem jest, odnośników do Airlines i HeadQ z DF1 z df2 a jeśli DF1 $ Data < DF2 $ Data następnie dokonać Cost_Index jako 0 lub inny kontynuować Cost_Index.

Próbowałem bezskutecznie z:

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 

Czy ktoś może wskazać mi właściwy kierunek?

Uwaga:

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

podczas prezentacji problemów związanych z danymi, które ma daty jej naprawdę najlepiej dostarczyć nam oryginalne dane, abyśmy wiedzieli, z czym pracujesz, czy możesz to zapewnić? Lub przynajmniej '' str (DF1) '' –

+0

Po prostu dodano strukturę ramek danych: @Cyrus Mohammadian –

+0

czy pojawia się błąd? jeśli nie, co wygenerował powyższy kod? –

Odpowiedz

14

Używanie warunkowe dołącza funkcji (ponieważ 1.9.8), chciałbym to zrobić w następujący sposób:

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

Dlaczego '' DF1 $ Cost_Index2 <-ifelse (DF1 $ Linie lotnicze == DF2 $ Linie lotnicze i DF1 $ HeadQ == DF1 $ HeadQ & DF1 $ Data

+1

Nie jestem największym fanem 'ifelse', ale po prostu uruchom, na przykład,' DF1 $ Linie lotnicze == DF2 $ Linie lotnicze' zobacz, co daje .. Wskazówka: recykling. Nie możesz po prostu zrównać dwóch równych/nierównych wektorów tutaj. Dla każdego wiersza w 'DF2', musisz uzyskać wszystkie pasujące wiersze w' DF1'. – Arun

+0

ahhh! Ok Widzę w tym przypadku, co powiesz na to: '' DF1 $ Koszt_indeksu [DF1 $ Linie lotnicze == DF2 $ Linie lotnicze i DF1 $ HeadQ == DF2 $ HeadQ & DF1 $ Data

Powiązane problemy