2016-08-29 5 views
-1

Prost, Ich habe zwei Datenrahmen mit der folgenden Struktur.Matching und Ersetzen von Werten einer Spalte in einem Datenrahmen nach Datum in r

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

nicht sicher, ob ich liebe es, aber ' DF1%>% muate_if (is.factor, as.character)%>% zeilenweise()%>% muate (Cost_Index = ifelse (isTRUE (Date alistaire

+0

Dies ist ein exaktes Duplikat Ihres vorherigen Q .. Sie haben das Richtige getan, indem Sie das Häkchen zu dieser Antwort entfernen, um anzuzeigen, dass Sie nach einem anderen Ansatz suchen, aber danach fragen wieder nicht. – Arun

Antwort

3

Sie können eine links von DF1 und DF2 auf den Airlines und HeadQ Joinspalten tun, und dann den Wert von Cost_Index wenn Date.x (Datum von DF1) basierend auf einer Änderung kleiner als Date.y (Datum von DF2). Mit dplyr Syntax (eine zusätzliche Überprüfung der wenn Date.y ist NA wird hier angewendet nach Ihrer Logik, dass, wenn es keine Übereinstimmung in DF2 ist, sollte die Cost_Index gleich bleiben):

library(dplyr) 

# convert the Date column to Date class for comparison 
df1$Date <- as.Date(df1$Date, "%m-%d-%Y") 
df2$Date <- as.Date(df2$Date, "%m-%d-%Y") 

df1 %>% 
     left_join(df2, by = c("Airlines", "HeadQ")) %>% 
     mutate(Cost_Index = ifelse(Date.x < Date.y & !is.na(Date.y), 0, Cost_Index), 
       Date = Date.x) %>% 
     select(-Date.x, -Date.y) 

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

Wusste nicht, dass "dplyr" Tabelle um zwei Spalten verbinden konnte, ohne eine Helper-Spalte zu erstellen. Gute Antwort. – MMerry

Verwandte Themen