आर

2014-11-03 22 views
5

में समकक्ष एक्सेल SUMIFS मैं आर के लिए बहुत नया हूं और एक एक्सेल वीबीए मैक्रो और एक्सेल वर्कशीट फ़ंक्शंस जैसे SUMIFS को पुन: बनाने के तरीकों को देख रहा हूं। यदि पंक्ति में अन्य कॉलम पर एकाधिक स्थितियों से मेल खाने वाली प्रविष्टियां हैं, तो SUMIFS एक स्तंभ कॉल करता है।आर

मेरे पास निम्न डेटा फ्रेम है और मैं एक नया कॉलम गणना करना चाहता हूं। नया कॉलम Sample की सभी पंक्तियों के लिए Start Date और EndDate सीमा के साथ ओवरलैप है। उदाहरण के लिए लाइन 1 पर यह 697 (पहले 3 lines का योग) होगा। योग विशेष रूप से करने के लिए मानदंड: शामिल Sample अगर EndDate >= StartDate[i] & StartDate <=EndDate[i]

StartDate EndDate Sample *SUMIFS example* 
10/01/14 24/01/14 139   *697* 
12/01/14 26/01/14 136 
19/01/14 02/02/14 422 
25/01/14 08/02/14 762 
29/01/14 12/02/14 899 
05/02/14 19/02/14 850 
07/02/14 21/02/14 602 
09/02/14 23/02/14 180 
18/02/14 04/03/14 866 

किसी भी टिप्पणी या संकेत बहुत सराहना की जाएगी।

उत्तर

2

मान लें कि आप एक डेटा फ्रेम में उपरोक्त डेटा df कहा जाता है: [...]

  • EndDate >= df$StartDate और StartDate <= df$EndDate में निर्दिष्ट शर्तों के साथ

    • df$Sample[...] का चयन करता है Sample स्तंभ,:

      sum(df$Sample[EndDate >= df$StartDate & StartDate <= df$EndDate]) 
      

      यही कारण है आपके उदाहरण से हैं, आर शर्तों में परिवर्तित, & के बीच में दोनों स्थितियों को एक ही समय में सत्य होने की आवश्यकता है। ध्यान दें कि अभिव्यक्ति में i अनुक्रमणिका नहीं हैं। इस तरह यह आर में काम करता है, अभिव्यक्ति का मूल्यांकन डेटा फ्रेम में प्रत्येक पंक्ति के लिए किया जाता है, और df$Sample[...] का परिणाम मूल्यों का एक वेक्टर है, केवल वे मान जहां [...] में अभिव्यक्ति सही थी

    • sum निश्चित रूप से एक निर्मित- योग की गणना करने के लिए फ़ंक्शन में, स्वाभाविक रूप से
  • +0

    यह नहीं देता है क्या ओ पी चाहता था, प्रत्येक पंक्ति के लिए वह अन्य सभी पंक्तियों को देखो और नमूना स्तंभ योग करना चाहते हैं तो यह मानदंडों को पूरा करती । –

    +0

    बहुत बहुत धन्यवाद, लेकिन जैसा कि कैमरून ने उल्लेख किया है, यह वही नहीं करता जो मैं उम्मीद कर रहा था (हालांकि वह इसे पूरी तरह से बताता है)। मैं मदद की सराहना करता हूं। – Barnaby1

    3

    आप इसे लूप या कार्टेशियन विलय के साथ कर सकते हैं। मैं वास्तव में ऐसा करने के लिए किसी भी अंतर्निहित कार्यों के बारे में नहीं जानता।

    library(dplyr) 
    
    x = structure(list(StartDate = structure(c(1389312000, 1389484800, 
    1390089600, 1390608000, 1390953600, 1391558400, 1391731200, 1391904000, 
    1392681600), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
        EndDate = structure(c(1390521600, 1390694400, 1391299200, 
        1391817600, 1392163200, 1392768000, 1392940800, 1393113600, 
        1393891200), tzone = "UTC", class = c("POSIXct", "POSIXt" 
        )), Sample = c(139L, 136L, 422L, 762L, 899L, 850L, 602L, 
        180L, 866L)), .Names = c("StartDate", "EndDate", "Sample" 
    ), row.names = c(NA, -9L), class = "data.frame") 
    
    x2 = x 
    names(x2)=c('StartDate2','EndDate2','Sample2') 
    x3 = merge(x,x2,allow.cartesian =T) 
    x4 = summarise(group_by(x3,StartDate,EndDate), 
        sumifs=sum(Sample2[EndDate2 >= StartDate & StartDate2 <= EndDate])) 
    x_sumifs = merge(x,x4,by=c('StartDate','EndDate')) 
    

    यह आउटपुट जैसा दिखता है।

    > x_sumifs 
        StartDate EndDate Sample sumifs 
    1 2014-01-10 2014-01-24 139 697 
    2 2014-01-12 2014-01-26 136 1459 
    3 2014-01-19 2014-02-02 422 2358 
    4 2014-01-25 2014-02-08 762 3671 
    5 2014-01-29 2014-02-12 899 3715 
    6 2014-02-05 2014-02-19 850 4159 
    7 2014-02-07 2014-02-21 602 4159 
    8 2014-02-09 2014-02-23 180 3397 
    9 2014-02-18 2014-03-04 866 2498 
    
    2

    आप base R से lapply/sapply का उपयोग करते हैं सकता है। @ Cameron.bracken की पोस्ट से x

    x$sumifs <- sapply(seq_len(nrow(x)), function(i) with(x, 
          sum(Sample[EndDate >= StartDate[i] & StartDate <= EndDate[i]]))) 
    
    x 
    # StartDate EndDate Sample sumifs 
    #1 2014-01-10 2014-01-24 139 697 
    #2 2014-01-12 2014-01-26 136 1459 
    #3 2014-01-19 2014-02-02 422 2358 
    #4 2014-01-25 2014-02-08 762 3671 
    #5 2014-01-29 2014-02-12 899 3715 
    #6 2014-02-05 2014-02-19 850 4159 
    #7 2014-02-07 2014-02-21 602 4159 
    #8 2014-02-09 2014-02-23 180 3397 
    #9 2014-02-18 2014-03-04 866 2498 
    
    0

    आप मूल्य प्राप्त करने के लिए 'द्वारा' फ़ंक्शन का उपयोग कर सकते हैं। 'द्वारा' डेटा फ्रेम में एक या अधिक कारकों के मानों द्वारा सब्सक्राइब किए गए डेटा फ्रेम में पंक्ति द्वारा विभाजित किया जाता है, और बदले में प्रत्येक सबसेट पर फ़ंक्शन लागू होता है।

    x$sumifs <- by(Sample[EndDate >= StartDate[i] & StartDate <= EndDate[i]],sum) 
    

    समारोह के बारे में अधिक जानकारी पाया जा सकता है here