2017-09-10 6 views
1

Ich habe diesen Datenrahmen:R - Mit Liste(), um aggregierte Datenrahmen

> head(DF, 10) 
     DATE USER CATEGORY  QTY 
1 2017-09-04  A79 Footwear  2167 
2 2017-08-31  A41 Accessories  342 
3 2017-08-27  A34 Accessories  828 
4 2017-08-22  A68 Accessories 1292 
5 2017-08-23  A68 Accessories 1297 
6 2017-08-23  A68 Footwear  1944 
7 2017-08-25  A68 Accessories  60 
8 2017-08-25  A68 Footwear   5 
9 2017-08-25  A68 Apparel  2454 
10 2017-08-29  A68 Accessories 2521 

Was ich will, ist dies:

> head(DF1, 10) 
     DATE USER        CATEGORIES QTY_SUM 
1 2017-09-04  A79 Footwear          2167 
2 2017-08-31  A41 Accessories         342 
3 2017-08-27  A34 Accessories         828 
4 2017-08-22  A68 Accessories         1292 
5 2017-08-23  A68 Accessories-1297, Footwear-1944    3241 
6 2017-08-25  A68 Accessories-60, Footwear-5, Apparel-2454  2519 
7 2017-08-29  A68 Accessories         2521 

ich mit aggregate versucht, funktioniert nicht gut. Ich denke, das könnte mit etwas Ähnliches möglich sein:

DF1 <- data.table(DF, key=c('DATE', 'USER_ID')) 
DF1 <- DF1[, list(CATEGORIES=paste0(CATEGORY, "-", QTY), QTY=sum(QTY)), by=c('DATE', 'USER_ID')] 
> head(x, 10) #getting this 
     DATE USER   CATEGORY  QTY 
1 2017-09-04  A79 Footwear-2167  2167 
2 2017-08-31  A41 Accessories-342  342 
3 2017-08-27  A34 Accessories-828  828 
4 2017-08-22  A68 Accessories-1292 1292 
5 2017-08-23  A68 Accessories-1297 1297 
6 2017-08-23  A68 Footwear-1944  1944 
7 2017-08-25  A68 Accessories-60  60 
8 2017-08-25  A68 Footwear-5    5 
9 2017-08-25  A68 Apparel-2454  2454 
10 2017-08-29  A68 Accessories   2521 

Was mache ich falsch? Bitte schlagen Sie vor, ob es bessere Möglichkeiten gibt, dies zu tun.

Antwort

4

Mit dplyr, können Sie:

df <- read.table(text=" 
DATE USER CATEGORY  QTY 
1 2017-09-04  A79 Footwear  2167 
2 2017-08-31  A41 Accessories  342 
3 2017-08-27  A34 Accessories  828 
4 2017-08-22  A68 Accessories 1292 
5 2017-08-23  A68 Accessories 1297 
6 2017-08-23  A68 Footwear  1944 
7 2017-08-25  A68 Accessories  60 
8 2017-08-25  A68 Footwear   5 
9 2017-08-25  A68 Apparel  2454 
10 2017-08-29  A68 Accessories 2521") 

library(dplyr) 

Wir ersten group_by DATE und USER (glaube ich), dann fügen Sie jedes Element in KATEGORIE mit etwas Dekoration. Schließlich heben Sie die Gruppierung Sie Ihre data.frame (tibble hier aber das bleibt ein data.frame):

df %>% 
    group_by(DATE, USER) %>% 
    summarise(CATEGORIES=paste(CATEGORY, QTY, sep="-", collapse=","), 
      QTY_SUM=sum(QTY)) %>% 
    ungroup() 

# A tibble: 7 x 4 
DATE USER        CATEGORIES QTY_SUM 
<fctr> <fctr>         <chr> <int> 
    1 2017-08-22 A68      Accessories-1292 1292 
2 2017-08-23 A68   Accessories-1297,Footwear-1944 3241 
3 2017-08-25 A68 Accessories-60,Footwear-5,Apparel-2454 2519 
4 2017-08-27 A34      Accessories-828  828 
5 2017-08-29 A68      Accessories-2521 2521 
6 2017-08-31 A41      Accessories-342  342 
7 2017-09-04 A79       Footwear-2167 2167 

Ist das, was Sie wollen?

+0

Vielen Dank, das ist perfekt. Ich habe jedoch gerade herausgefunden, dass ich diesen "Kollaps" innerhalb der "paste0" -Funktion vermisse, was auch die Aufgabe erfüllt. – Arani

Verwandte Themen