2012-04-03 20 views
14

में लापता (/ मौजूद नहीं) पंक्तियों को ढूंढें और जोड़ें, मैं निम्नलिखित के साथ संघर्ष कर रहा हूं।आर: समय से संबंधित डेटा फ्रेम

तो निम्नलिखित के साथ एक (बड़ा) डेटा फ्रेम है:

  • कई स्तंभ जिसके लिए कॉलम के संयोजन एक 'अद्वितीय' संयोजन है, कहते हैं कि आईडी
  • एक समय संबंधित स्तंभ
  • एक संबंधित कॉलम

मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक समय अंतराल के लिए प्रत्येक अद्वितीय आईडी के लिए डेटा फ्रेम में एक उपाय उपलब्ध हो। और यदि ऐसा नहीं है, तो मैं उस समय/आईडी के लिए 0 (या एनए) उपाय जोड़ना चाहता हूं।

समस्या को वर्णन करने के लिए निम्न test डेटा फ्रेम बनाने:

test <- data.frame(
    YearWeek =rep(c("2012-01","2012-02"),each=4), 
    ProductID =rep(c(1,2), times=4), 
    CustomerID =rep(c("a","b"), each=2, times=2), 
    Quantity =5:12 
)[1:7,] 

    YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   2   a  6 
3 2012-01   1   b  7 
4 2012-01   2   b  8 
5 2012-02   1   a  9 
6 2012-02   2   a  10 
7 2012-02   1   b  11 

8 वीं पंक्ति बाहर छोड़ दिया है उद्देश्य पर,। इस तरह मैं "2012-02" समय मूल्य के लिए आईडी '2-बी' (ProductID-CustomerID) के लिए 'लापता मूल्य' (अनुपलब्ध Quantity) अनुकरण करता हूं।

मैं जो करना चाहता हूं वह डेटा.फ्रेम को इस तरह से समायोजित करता है कि सभी समय मूल्यों के लिए (ये ज्ञात हैं, केवल "2012-01" और "2012-02"), सभी आईडी- संयोजन (ये पहले से ज्ञात नहीं हैं, लेकिन यह 'डेटा फ्रेम में सभी अद्वितीय आईडी संयोजन' है, इस प्रकार आईडी कॉलम पर अद्वितीय सेट), डेटा फ्रेम में एक मात्रा उपलब्ध है।

(यदि हम लापता मूल्य के लिए NA चुनते हैं, आम तौर पर मुझे लगता है कि पर नियंत्रण चाहते हैं) यह इस उदाहरण के लिए परिणाम चाहिए:

YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   2   a  6 
3 2012-01   1   b  7 
4 2012-01   2   b  8 
5 2012-02   1   a  9 
6 2012-02   2   a  10 
7 2012-02   1   b  11 
8 2012-02   2   b  NA 

अंतिम लक्ष्य इन आईडी संयोजन के लिए समय श्रृंखला बनाने के लिए है और इसलिए मैं हर समय मूल्यों के लिए मात्रा चाहता हूं। मैं (समय पर) अलग एकत्रित करने के लिए और एक बड़ा डाटासेट

मैं reshape पैकेज से melt और cast साथ कई चीजें करने की कोशिश की, उदाहरण के लिए से पहचान पत्र के विभिन्न स्तरों का उपयोग कर की जरूरत है। लेकिन अब तक मैंने इसे करने का प्रबंधन नहीं किया है। अगला चरण फ़ंक्शन-लूप्स इत्यादि के साथ एक फ़ंक्शन बना रहा है, लेकिन यह प्रदर्शन परिप्रेक्ष्य से वास्तव में उपयोगी नहीं है।

शायद समय श्रृंखला बनाने के लिए एक आसान तरीका है, डेटा को देना। test जैसे डेटा। क्या किसी के पास इस पर कोई विचार है ??

अग्रिम धन्यवाद!

ध्यान दें कि वास्तविक समस्या में दो से अधिक 'आईडी कॉलम' हैं।


संपादित करें:

मैं इस समस्या आगे वर्णन करना चाहिए। 'समय' कॉलम और 'आईडी' कॉलम के बीच एक अंतर है। प्रश्न पर पहला (और महान!) उत्तर जोरेन, शायद मुझे जो चाहिए उससे स्पष्ट समझ नहीं मिली (और मैंने जो उदाहरण दिया है, वह अंतर स्पष्ट नहीं किया गया है)।

सभी आईडी-संयोजन के लिए

(इन अग्रिम नहीं जाना जाता है, लेकिन यह 'सभी डेटा फ्रेम में अद्वितीय ID संयोजन', इस प्रकार आईडी स्तंभों पर अद्वितीय सेट है)

: मैं ऊपर कहा

इसलिए मैं 'सभी संभावित आईडी संयोजन' नहीं चाहता लेकिन 'डेटा के भीतर सभी आईडी संयोजन' चाहता हूं। उन संयोजनों में से प्रत्येक के लिए मैं प्रत्येक अद्वितीय समय-मूल्य के लिए एक मूल्य चाहता हूं।

मुझे test2 को यह स्पष्ट कर दूं test का विस्तार करके, के रूप में

> test2 <- rbind(test, c("2012-02", 3, "a", 13)) 
> test2 
    YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   2   a  6 
3 2012-01   1   b  7 
4 2012-01   2   b  8 
5 2012-02   1   a  9 
6 2012-02   2   a  10 
7 2012-02   1   b  11 
8 2012-02   3   a  13 

जिसका मतलब है मैं परिणामी डेटा फ्रेम में कोई '3-बी' आईडी संयोजन चाहते हैं, क्योंकि इस संयोजन test2 के भीतर नहीं है इस प्रकार करते हैं। अगर मैं पहले उत्तर की विधि का उपयोग मैं निम्नलिखित मिल जाएगा:

> vals2 <- expand.grid(YearWeek = unique(test2$YearWeek), 
         ProductID = unique(test2$ProductID), 
         CustomerID = unique(test2$CustomerID)) 

> merge(vals2,test2,all = TRUE) 
    YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   1   b  7 
3 2012-01   2   a  6 
4 2012-01   2   b  8 
5 2012-01   3   a  <NA> 
6 2012-01   3   b  <NA> 
7 2012-02   1   a  9 
8 2012-02   1   b  11 
9 2012-02   2   a  10 
10 2012-02   2   b  <NA> 
11 2012-02   3   a  13 
12 2012-02   3   b  <NA> 

तो मैं नहीं चाहता कि पंक्तियों 6 और 12 यहाँ रहना चाहता हूँ।

इस समस्या को दूर करने के लिए मुझे नीचे दिए गए एक समाधान मिला। यहां मैंने 'अद्वितीय समय कॉलम' और 'अद्वितीय आईडी संयोजन' को विभाजित किया। उपर्युक्त के साथ अंतर इस प्रकार 'संयोजन' शब्द है और प्रत्येक आईडी कॉलम के लिए अद्वितीय नहीं है।

> temp_merge <- merge(unique(test2["YearWeek"]), 
         unique(test2[c("ProductID", "CustomerID")])) 

> merge(temp_merge,test2,all = TRUE) 
    YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   1   b  7 
3 2012-01   2   a  6 
4 2012-01   2   b  8 
5 2012-01   3   a  <NA> 
6 2012-02   1   a  9 
7 2012-02   1   b  11 
8 2012-02   2   a  10 
9 2012-02   2   b  <NA> 
10 2012-02   3   a  13 

इस पर क्या टिप्पणियां हैं?

क्या यह एक शानदार तरीका है, या बेहतर तरीके हैं?

उत्तर

20

उपयोग expand.grid और merge:

vals <- expand.grid(YearWeek = unique(test$YearWeek), 
        ProductID = unique(test$ProductID), 
        CustomerID = unique(test$CustomerID)) 
> merge(vals,test,all = TRUE) 
    YearWeek ProductID CustomerID Quantity 
1 2012-01   1   a  5 
2 2012-01   1   b  7 
3 2012-01   2   a  6 
4 2012-01   2   b  8 
5 2012-02   1   a  9 
6 2012-02   1   b  11 
7 2012-02   2   a  10 
8 2012-02   2   b  NA 

NA तथ्य जो कुछ के साथ आप subsetting और is.na का उपयोग कर चयन को महत्व देता है के बाद बदला जा सकता है।

+0

+1 सुंदर ... –

+0

गति के लिए +1, और 'expand.grid()' के लिए, जिसे आपको प्यार करना होगा। मैंने कभी-कभी उन दो कार्यों को पारित करने के लिए तर्कों के सभी संयोजनों के निर्माण के लिए एक उपकरण के रूप में 'mapply() 'या' plyr :: maply() 'के संयोजन के साथ प्रयोग किया है। क्या कोई और ऐसा करता है, या क्या कोई बेहतर मुहावरे है? –

+0

@ जोशो'ब्रायन - यही वही तरीका है जिसे मैंने अतीत का उपयोग किया है और प्रदर्शन से काफी खुश हूं। हालांकि मुझे कुछ झिलमिलाहट देखने में खुशी होगी। – Chase

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