2016-08-29 17 views
-1

乾杯、 次の構造のデータフレームが2つあります。データフレーム内の列の値と日付の一致と置換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 

第二のデータフレームがDF2は、以下の構造を有する:

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

今すぐデータフレームDF1とDF2を見上げ、私は、次のデータフレームにDF1を変更したいと思います。

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 

条件は、航空、DF2からDF1のHeadQのルックアップで、DF1 $日< DF2 $日が続い0としてCost_Indexを作るか、他Cost_Indexを続行します。

私は、失敗し、試してみました:

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 

誰もが正しい方向に私を指すことができますか?

注:

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

ない、私はそれを愛することを確認、しかし:dplyr構文で(Date.yNAある場合の追加のチェックがDF2で一致がない場合、Cost_Indexは同じまま必要があることを、あなたのロジックに応じて、ここで適用されます) ($ DF2 $ DF2 $ Airlines == Airlines&DF2 $ HeadQ == HeadQ、 ''); $ mutate_if(is.factor、as.character)%>%rowwise()%>%mutate(コストインデックス= ifelse日付]])、0L、Cost_Index)) ' – alistaire

+0

これはあなたの前のQと全く同じです。別のアプローチを探しているのにそれを尋ねていることを示すために、もう一度ではありません。 – Arun

答えて

3

あなたがAirlinesHeadQ列にDF1DF2の参加左を行い、その後、Date.xDF1から日が)Date.yよりも小さい場合に基づいCost_Indexの値を変更することができます(DF2からの日付)。 `

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

'dplyr'がヘルパー列を作成せずに2つの列で表を結合できることを知らなかった。いい答えだ。 – MMerry

関連する問題