2016-08-29 24 views
6

Chúc mừng, Tôi có hai khung dữ liệu với cấu trúc sau.Đối sánh và thay thế các cột của khung dữ liệu theo nhiều điều kiện

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 

khung dữ liệu thứ hai DF2 có cấu trúc sau:

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

Bây giờ nhìn lên với dữ liệu các khung df1 và DF2, tôi muốn thay đổi df1 vào khung dữ liệu sau.

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 

Điều kiện là, tra cứu cho Airlines và HeadQ của df1 từ DF2 và nếu df1 $ Ngày < DF2 $ ngày sau đó hãy chắc Cost_Index là 0 hoặc nếu không tiếp tục với Cost_Index.

tôi đã cố gắng, nhưng không thành công, với:

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 

bất cứ ai có thể chỉ cho tôi đi đúng hướng?

Lưu ý:

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

khi trình bày các vấn đề liên quan đến dữ liệu mà có ngày nó thực sự tốt nhất để cung cấp cho chúng tôi dữ liệu gốc của bạn để chúng tôi biết bạn đang làm việc với điều gì, bạn có thể cung cấp dữ liệu đó không? Hoặc ít nhất '' str (DF1) '' –

+0

Chỉ cần thêm cấu trúc của khung dữ liệu: @Cyrus Mohammadian –

+0

bạn có gặp lỗi không? nếu không, mã trên của bạn được tạo ra như thế nào? –

Trả lời

14

Sử dụng có điều kiện tham gia tính năng (kể từ 1.9.8), tôi muốn làm điều này như sau:

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

Tại sao 'DF1 $ Cost_Index2 <-felse (DF1 $ Airlines == DF2 $ Airlines & DF1 $ HeadQ == DF1 $ HeadQ & DF1 $ ngày

+1

Tôi không phải là người hâm mộ lớn nhất của 'ifelse', nhưng chỉ cần chạy, ví dụ, 'DF1 $ Airlines == DF2 $ Airlines' sẽ thấy những gì nó cho .. gợi ý: tái chế. Bạn không thể chỉ đơn giản là equate hai véc tơ bằng nhau/không bằng nhau ở đây .. Đối với mỗi hàng trong 'DF2', bạn đã nhận được tất cả các hàng phù hợp trong' DF1'. – Arun

+0

ahhh! Ok tôi thấy, trong trường hợp đó, cách tiếp cận này: '' DF1 $ Cost_Index [DF1 $ Airlines == DF2 $ Airlines & DF1 $ HeadQ == DF2 $ HeadQ & DF1 $ Ngày

Các vấn đề liên quan