2016-08-29 6 views
6

चीयर्स, मेरे पास निम्न संरचना के साथ दो डेटा फ्रेम हैं।एकाधिक स्थितियों से डेटाफ्रेम के कॉलम को मिलान और प्रतिस्थापित करें

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

जब है कि डेटा से संबंधित समस्याओं पेश वास्तव में इसकी तारीखें हमें अपना मूल डेटा प्रदान करने के लिए सबसे अच्छा है ताकि हम जान सकें कि आप किसके साथ काम कर रहे हैं, क्या आप इसे प्रदान कर सकते हैं? या कम से कम '' str (DF1) '' –

+0

बस डेटा फ्रेम की संरचना को जोड़ा गया: @Cyrus Mohammadian –

+0

क्या आपको कोई त्रुटि मिल रही है? यदि नहीं, तो आपके उपरोक्त कोड का क्या उत्पादन हुआ है? –

उत्तर

14

का उपयोग करते हुए इस प्रकार सशर्त सुविधा (1.9.8 के बाद से) मिलती है, मैं यह कर चाहते हैं:

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

'डीएफ 1 $ Cost_Index2 <-ifelse (डीएफ 1 $ एयरलाइंस == डीएफ 2 $ एयरलाइंस और डीएफ 1 $ हेडक्यू == डीएफ 1 $ हेडक्यू और डीएफ 1 $ दिनांक <डीएफ 2 $ दिनांक, 0, डीएफ 1 $ लागत_इंडेक्स)' ' परिणाम? इसके बजाय, '' 2016-07-31'' से जुड़े '' Cost_Index'' को '' 0'' (यानी '' 220'' ''0''' द्वारा प्रतिस्थापित किया गया है) –

+1

मैं सबसे बड़ा प्रशंसक नहीं हूं 'ifelse' का, लेकिन बस चलाएं, उदाहरण के लिए, 'डीएफ 1 $ एयरलाइंस == डीएफ 2 $ एयरलाइंस' यह देखता है कि यह क्या देता है .. संकेत: रीसाइक्लिंग। आप यहां केवल दो बराबर/असमान वैक्टरों को समान नहीं कर सकते हैं .. प्रत्येक पंक्ति के लिए 'डीएफ 2' में, आपको सभी मिलान पंक्तियों को 'डीएफ 1' में प्राप्त करना होगा। – Arun

+0

आह! ठीक है, मैं देखता हूं, उस मामले में, इस दृष्टिकोण के बारे में: 'डीएफ 1 $ लागत_इंडेक्स [डीएफ 1 $ एयरलाइंस == डीएफ 2 $ एयरलाइंस और डीएफ 1 $ हेडक्यू == डीएफ 2 $ हेडक्यू और डीएफ 1 $ दिनांक <डीएफ 2 $ तिथि] <- 0'' डेटाटेबल के साथ सही आउटपुट –

संबंधित मुद्दे

 संबंधित मुद्दे