2015-01-28 7 views
7

özetlemek için: Ben dataframe özetlemek ve endeksleri her dizin için benzersiz bir sicile sahip olmak benim istenen çıktıyı istiyorumR: birçok kritere göre özetlemek ve İşte benim orijinal veri çerçevesi masayı

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) 

ve her tarih Tarih sütunundaki tüm değerler için numaralı yeni bir sütunda olaylar_tablodaki her bir olayın kümülatif değerini sağlarken date_range. Bazen her indeks veya her tarih için kayıt yoktur. Bu veri çerçevesinin basitleştirilmiş bir sürümüdür -

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 

Bilginize:

İşte benim istenen çıkıştır. Her bir Tarih için yüzlerce farklı Dizin alanıyla yılda ~ 200.000 kayıt vardır.

Sabit disk sürücümün by ve belki de aggregate kullanılarak kızartılmadan önceki geçmişte yaptım, ancak işlem çok yavaştı ve bu sefer bu işe yaramadı. Ben de ddply denedim, ancak onunla çalışmak için cumsum işlevini alamıyorum. boşuna

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

: ddply kullanarak, böyle bir şey denedim.
Arama yoluyla, projemin birikimli kısmını oluşturan Replicating an Excel SUMIFS formula ürününü buldum, ancak bununla birlikte tarih/dizin başına yalnızca bir rekoru nasıl özetleyeceğimi anlayamadım. Ben de sum/aggregate data based on dates, R arasında rastladım ama burada dinamik tarih yönünü çalıştıramadım.

Yardım edebilecek herkes için teşekkürler!

+0

Beklediğiniz çıktıyla karıştırıldım. Beklenen çıktınızın bir satırında, cumsum (Event = x) '' 0' olmasını mı bekliyorsunuz? Orijinal 'df'' Date = 2014-03-31', 'Index = A' ve' Event = x' ile 2 satıra sahip olsa da? – davechilders

+0

Vurgulama eklemek istiyorum "İstenen çıktının veri çerçevemi özetlemesini istiyorum ve indekslerdeki her indeks ve date_range'daki her bir tarih için benzersiz bir kayıt olmasını istiyorum. Etkinlik, her bir olayın kümülatif değerini yeni bir sütunda ** oluşturabilir. Tarih sütunu ** " ...... Arka plan için, o sabah bana sunulacak bilgileri kullanarak bir model oluşturmaya çalışıyorum. Yani 2014-03-31 sabahı, elimde veri yok.Gün boyunca, veri toplanır ve 2014-04-01 verileri, 2014-03-03'teki veriler 2014-04-01 – exhoosier10

+0

'daki olayları tahmin etmem için elimden geleni yapacaktır. İlk okumamda bunu özledim. – davechilders

cevap

3
library(dplyr) 
library(tidyr) 

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

Adım 1: {Tarih, Dizin} çiftleri

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

Adım 2 tam bir listesini oluşturun: NA

cumsum2 <- function(x){ 

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

} 

Adım 3 görmezden bir cumsum() fonksiyonunu tanımlayın : {Tarih, Dizin} başına toplamlar oluşturun, tam {Tarih, Dizin} verileriyle birleştirin, ve l'yi hesaplayın toplam kümülatif toplam

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

parlak. Bu 200 bin satır için <10 saniye sürdü. Yardımınıza minnettar olurum! – exhoosier10

1

dplyr ve tidyr ile böyle bir şey çalışır mı?

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

'spread()' in burada akıllıca kullanımı. +1 –

+0

Bu, her şeyi özetlemek için yararlıdır, teşekkürler .... Amacım, her bir benzersiz Endeks (tüm endeksler) ve Tarih (2014-03-31 ve 2014-09-30 tarihleri ​​arasındaki tarihler) için bir rekor elde etmekti Bunu, yılın sonuna kadarki tüm verilerin her günü için ayrı bir dosyaya aktarabilirim. Bazı günlerde Index A'da bilgi toplamıyoruz, yani bu yöntemin kullanıldığı tarih = '2014-04-02' ise, sadece B Endeksi için değil, verileri de görüyorum. Her bir benzersiz Date + Index anahtarına ek null eklenmiş kayıt eklemeden? – exhoosier10

+0

@maloneypatr - Çözümünüzün OP'nin istenen çıktılarıyla eşleştiğini düşünmüyorum. – davechilders

İlgili konular