2015-01-28 10 views
7

यहाँ मेरी मूल डेटा फ्रेम है कैसे:आर: कई मानदंडों के आधार पर योग और टेबल संक्षेप में प्रस्तुत

df <- read.table(text=" 
    Date   Index Event 
    2014-03-31 A  x 
    2014-03-31 A  x 
    2014-03-31 A  y 
    2014-04-01 A  y 
    2014-04-01 A  x 
    2014-04-01 B  x 
    2014-04-02 B  x 
    2014-04-03 A  x 
    2014-09-30 B  x", header = T, stringsAsFactors = F) 

date_range <- seq(as.Date(min(df$Date)), as.Date(max(df$Date)), 'days') 
indices <- unique(df$Index) 
events_table <- unique(df$Event) 

मैं अपने वांछित आउटपुट चाहते हैं मेरी dataframe संक्षिप्त और सूचकांक में प्रत्येक सूचकांक के लिए एक अनूठा रिकॉर्ड करने के लिए और दिनांक दिनांक_रेंज में प्रत्येक दिनांक दिनांक कॉलम में मान से पहले सभी तिथियों के लिए नए कॉलम में events_table में प्रत्येक ईवेंट का संचयी मान प्रदान करते समय। कभी-कभी प्रत्येक इंडेक्स या हर तारीख के लिए कोई रिकॉर्ड नहीं होता है। इस डेटा फ्रेम का एक सरलीकृत संस्करण है -

Date  Index cumsum(Event = x) cumsum(Event = y) 
2014-03-31 A  0     0 
2014-03-31 B  0     0 
2014-04-01 A  2     1 
2014-04-01 B  0     0 
2014-04-02 A  3     2 
2014-04-02 B  1     0 
... 
2014-09-29 A  4     2 
2014-09-29 B  2     0 
2014-09-30 A  4     2 
2014-09-30 B  2     0 

FYI करें:

यहाँ मेरी वांछित उत्पादन होता है। प्रत्येक तिथि के लिए सैकड़ों अलग-अलग इंडेक्स फ़ील्ड के साथ प्रति वर्ष 200,000 रिकॉर्ड हैं।

मैंने by और शायद aggregate का उपयोग करके मेरी हार्ड ड्राइव तला हुआ जाने से पहले इसे पहले किया है, लेकिन प्रक्रिया बहुत धीमी थी और मैं इस बार इसे बाहर करने में सक्षम नहीं हूं। मैंने ddply भी कोशिश की है, लेकिन मैं इसके साथ काम करने के लिए cumsum फ़ंक्शन प्राप्त करने में सक्षम नहीं हूं। कोई लाभ नहीं हुआ

ddply(xo1, .(Date,Index), summarise, 
     sum.x = sum(Event == 'x'), 
     sum.y = sum(Event == 'y')) 

: ddply का उपयोग करना, मैं की तरह कुछ करने की कोशिश की।
खोज के माध्यम से, मुझे Replicating an Excel SUMIFS formula मिल गया है जो मुझे मेरे प्रोजेक्ट का संचयी हिस्सा प्राप्त करता है, लेकिन इसके साथ मैं यह समझने में सक्षम नहीं था कि इसे प्रति दिन/सूचकांक कॉम्बो में केवल एक रिकॉर्ड कैसे सारांशित किया जाए। मैं sum/aggregate data based on dates, R पर भी आया लेकिन यहां मैं गतिशील दिनांक पहलू को काम करने में सक्षम नहीं था।

किसी भी व्यक्ति के लिए धन्यवाद जो मदद कर सकता है!

+0

मैं आपके अपेक्षित आउटपुट से उलझन में हूं। आपके अपेक्षित आउटपुट की एक पंक्ति में, आप 'cumsum (event = x) '' 0' होने की अपेक्षा करते हैं? भले ही आपके मूल 'डीएफ' में' दिनांक = 2014-03-31', 'इंडेक्स = ए', और' ईवेंट = एक्स' 'के साथ 2 पंक्तियां हों? – davechilders

+0

जोर जोड़ना "मैं अपने वांछित आउटपुट को अपने डेटाफ्रेम को सारांशित करना चाहता हूं और इंडेक्स में प्रत्येक इंडेक्स और डेट्रेंज में प्रत्येक तारीख के लिए एक अद्वितीय रिकॉर्ड प्राप्त करता हूं, जबकि नए कॉलम में ईवेंट_टेबल में प्रत्येक ईवेंट का संचयी मूल्य प्रदान करता है ** सभी तिथियों के लिए दिनांक कॉलम ** " ...... पृष्ठभूमि के लिए, मैं उस जानकारी का उपयोग करके एक मॉडल बनाने की कोशिश कर रहा हूं जो उस सुबह मेरे लिए उपलब्ध होता। तो 2014-03-31 की सुबह, मेरे पास कोई डेटा उपलब्ध नहीं है।पूरे दिन, डेटा एकत्र किया जाता है, और 2014-04-01 को, 2014-03-31 से डेटा 2014-04-01 – exhoosier10

+0

पर घटनाओं की भविष्यवाणी करने के लिए उपलब्ध होगा जो स्पष्टीकरण के लिए धन्यवाद। मुझे याद आया कि मेरे शुरुआती पढ़ने पर। – davechilders

उत्तर

3
library(dplyr) 
library(tidyr) 

df$Date <- as.Date(df$Date) 

चरण 1: {Date, सूचकांक} जोड़े

full_dat <- expand.grid(
    Date = date_range, 
    Index = indices, 
    stringsAsFactors = FALSE 
) %>% 
    arrange(Date, Index) %>% 
    tbl_df 

चरण 2 की एक पूरी सूची तैयार करें: परिभाषित cumsum() समारोह है कि ध्यान नहीं देता NA

cumsum2 <- function(x){ 

    x[is.na(x)] <- 0 
    cumsum(x) 

} 

चरण 3 : प्रति {दिनांक, अनुक्रमणिका} के कुल योग उत्पन्न करें, पूर्ण {दिनांक, अनुक्रमणिका} डेटा, से जुड़ें और एल की गणना करें संचयी संचयी योग।

df %>% 
    group_by(Date, Index) %>% 
    summarise(
    totx = sum(Event == "x"), 
    toty = sum(Event == "y") 
    ) %>% 
    right_join(full_dat, by = c("Date", "Index")) %>% 
    group_by(Index) %>% 
    mutate(
    cumx = lag(cumsum2(totx)), 
    cumy = lag(cumsum2(toty)) 
    ) %>% 
    # some clean up. 
    select(-starts_with("tot")) %>% 
    mutate(
    cumx = ifelse(is.na(cumx), 0, cumx), 
    cumy = ifelse(is.na(cumy), 0, cumy) 
    ) 
+0

शानदार। इन 200k पंक्तियों के लिए <10 सेकंड लिया। आपकी सहायता की सराहना! – exhoosier10

1

क्या ऐसा कुछ dplyr और tidyr काम कर रहा है?

library(dplyr) 
library(tidyr) 

df %>% 
    group_by(Date, Index, Event) %>% 
    summarise(events = n()) %>% 
    group_by(Index, Event) %>% 
    mutate(cumsum_events = cumsum(events)) %>% 
    select(-events) %>% 
    spread(Event, cumsum_events) %>% 
    rename(sum.x = x, 
     sum.y = y) 

#  Date Index sum.x sum.y 
#1 2014-03-31  A  2  1 
#2 2014-04-01  A  3  2 
#3 2014-04-01  B  1 NA 
#4 2014-04-02  B  2 NA 
#5 2014-04-03  A  4 NA 
#6 2014-09-30  B  3 NA 
+0

यहां 'फैलाव() 'का चालाक उपयोग। +1 –

+0

यह सब कुछ सारांशित करने के लिए उपयोगी है, धन्यवाद .... मेरा लक्ष्य प्रत्येक अद्वितीय इंडेक्स (सभी इंडेक्स) और दिनांक (2014-03-31 और 2014-09-30 के बीच की तारीख) कॉम्बो के लिए एक रिकॉर्ड होना था कि मैं उस बिंदु तक के सभी वर्ष के डेटा के प्रत्येक दिन के लिए एक व्यक्तिगत फ़ाइल में निर्यात कर सकता हूं। कुछ दिन हम इंडेक्स ए पर जानकारी एकत्र नहीं करते हैं, इसलिए यदि मैं इस विधि का उपयोग कर दिनांक = '2014-04-02' से सबसेट करता हूं, तो मुझे केवल इंडेक्स बी के लिए डेटा दिखाई देगा और नहीं। क्या कोई पाने का कोई त्वरित तरीका है कि प्रत्येक अद्वितीय तिथि + सूचकांक कुंजी के लिए अतिरिक्त nulled बाहर रिकॉर्ड जोड़ने के बिना ?? – exhoosier10

+0

@maloneypatr - मुझे नहीं लगता कि आपका समाधान ओपी के वांछित आउटपुट से मेल खाता है। – davechilders

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