2016-01-23 5 views
5

मिलान के बाद मैं कुछ कोड कृपया @Eric असफल द्वारा दी गई साथ, पंक्तियों को दो डेटा फ्रेम, DF1 और df2 के बीच से मेल को दूर करने में सक्षम हूँ @steveb द्वारा समाधाननिकाला जा रहा है दिन पहले और पंक्ति

df1 %>% filter(! ((date == df2$date) & (ticker == df2$ticker)))

हालांकि, मुझे एहसास हुआ कि मैं इस तरह न केवल साझा पंक्ति को हटाने की जरूरत:

012,351,
df1 <- data.frame(ticker = c("MSFT", "MSFT", "MSFT", "MSFT"), 
date = c("2016-01-01", "2016-01-02", "2016-01-03", "2016-01-04"), stringsAsFactors=F) 
df1 

    ticker  date 
1 MSFT 2016-01-01 
2 MSFT 2016-01-02 
3 MSFT 2016-01-03 
4 MSFT 2016-01-04 

df2 <- data.frame(ticker = c("AAPL", "GOOG", "MSFT", "FB"), 
date = c("2016-01-01", "2016-01-01", "2016-01-02", "2016-01-03"), stringsAsFactors=F) 
df2 

    ticker  date 
1 AAPL 2016-01-01 
2 GOOG 2016-01-01 
3 MSFT 2016-01-02 
4  FB 2016-01-03 

df3 

    ticker  date 
1 MSFT 2016-01-01 
2 MSFT 2016-01-03 
3 MSFT 2016-01-04 

लेकिन दिन पहले और दिन के बाद, निर्दिष्ट पंक्ति। तो मेरा अंतिम df होगा:

ticker  date 
1 MSFT 2016-01-04 

सूचना, 3 MSFT 2016-01-02 मैच था, तो उस पंक्ति, हटा दिया जाना चाहिए एक दिन पहले और दिन के बाद, 3 MSFT 2016-01-01 और 3 MSFT 2016-01-03

दो मैचों के साथ उदाहरण के साथ की जरूरत है:

df1 <- data.frame(ticker = c("MSFT", "MSFT", "MSFT", "MSFT"), 
        date = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03", "2016-01-04")), 
        stringsAsFactors=F) 
df2 <- data.frame(ticker = c("AAPL", "GOOG", "MSFT", "MSFT"), 
        date = as.Date(c("2016-01-01", "2016-01-01", "2016-01-01","2016-01-02")), 
        stringsAsFactors=F) 

लक्ष्य उत्पादन:

ticker  date 
4 MSFT 2016-01-04 

उत्तर

4

आप तारीखों के तार परिवर्तित कर सकते हैं ताकि आप

df1 <- data.frame(ticker = c("MSFT", "MSFT", "MSFT", "MSFT"), 
        date = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03", "2016-01-04")), 
        stringsAsFactors=F) 
df2 <- data.frame(ticker = c("AAPL", "GOOG", "MSFT", "FB"), 
        date = as.Date(c("2016-01-01", "2016-01-01", "2016-01-02", "2016-01-03")), 
        stringsAsFactors=F) 


(m <- df2[(df2$date %in% df1$date) & (df2$ticker %in% df1$ticker), ]) 
# ticker  date 
# 3 MSFT 2016-01-02 

df1[!(df1$date %in% (m$date + c(-1,0,1))), ] 

# ticker  date 
# 4 MSFT 2016-01-04 

संपादित जोड़ने और घटाने के कर सकते हैं दिन - कई मैचों के लिए, बस प्रत्येक तारीख

df1 <- data.frame(ticker = c("MSFT", "MSFT", "MSFT", "MSFT"), 
        date = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03", "2016-01-04")), 
        stringsAsFactors=F) 
df2 <- data.frame(ticker = c("AAPL", "GOOG", "MSFT", "MSFT"), 
        date = as.Date(c("2016-01-01", "2016-01-01", "2016-01-01","2016-01-02")), 
        stringsAsFactors=F) 

(m <- df2[(df2$date %in% df1$date) & (df2$ticker %in% df1$ticker), ]) 
# ticker  date 
# 3 MSFT 2016-01-01 
# 4 MSFT 2016-01-02 

df1[!(df1$date %in% (sapply(m$date, function(x) x + c(-1,0,1)))), ] 
# ticker  date 
# 4 MSFT 2016-01-04 
+0

अत्यंत सुरुचिपूर्ण भर function(x) लागू होते हैं। यह आश्चर्यजनक रूप से काम करता है, सिवाय इसके कि जब मुझे दो या दो से अधिक मैच मिलते हैं तो मुझे चेतावनी मिलती है 'चेतावनी संदेश: अनक्लास (ई 1) + अनक्लास (ई 2): लंबी ऑब्जेक्ट लम्बाई छोटी वस्तु लंबाई की एक बहु नहीं है' और केवल अंतिम मैच हटा दिया गया है। मैंने एक लूप बनाने की कोशिश की जो केवल दो मैचों से अधिक है, लेकिन मुझे लगता है कि एक बेहतर तरीका है। मैंने अपने मूल प्रश्न के बजाय एक के बजाय दो मैचों के साथ एक और उदाहरण जोड़ा। – RyGuy

+1

@RyGuy कोशिश करें 'df1 [! (% में df1 $ date% (sapply (m $ date, function (x) x + c (-1,0,1))),] ' – rawr

+0

शानदार! धन्यवाद। – RyGuy

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