2017-11-28 2 views
0
library(dplyr) ##activates the data.table library 

mydataWithWeeksAndWeights <- data_frame(ended = c("14/11/2016", 
                "14/11/2016", 
                "14/11/2016", 
                "02/01/2017", 
                "02/01/2017", 
                "15/11/2017", 
                "15/11/2017", 
                "16/11/2017", 
                "16/11/2017"), 
             week = c(46, 46, 46, 1, 1, 46, 46, 46, 46), 
             satisfactionLevel = c("Very dissatisfied", 
                   "Very satisfied", 
                   "Satisfied", 
                   "Dissatisfied", 
                   "Very dissatisfied", 
                   "Very satisfied", 
                   "Very dissatisfied", 
                   "Very Satisfied", 
                   "Very satisfied"), 
             weight = c(0, 1, 0.75, 0.25, 0, 1, 0, 1, 1)) 

Wenn ich die Funktion folgende nennen pivotTable <- mydataWithWeeksAndWeights %>% group_by(week, weight) %>% count(satisfactionLevel) den satisfactionLevel 46 Einträge für alle Woche zählt. Das Problem ist, dass sich die 46. Woche für die ersten drei Zeilen auf 2016 bezieht und die restlichen 2017 beziehen. Ich möchte diese doppelten Einträge behalten.Halten Sie doppelte Einträge, wo ich group_by() verwenden, von dplyr

+0

Versuchen Sie 'mydataWithWeeksAndWeights%>% group_by (Woche, Gewicht)%>% Filter (n()> 1)' – akrun

+2

Ich denke, Sie möchten zwischen den Jahren unterscheiden. Sie können dies mit 'df%>% group_by (Jahr_Woche = Format (als Datum (beendet,"% d /% m /% Y "),"% Y-% W "), Gewicht)%>% Anzahl (satisfactionLevel) ' –

+0

@docendodiscimus Legendär !!! Prost – Greconomist

Antwort

2

Ich kann nicht sicher sein, dass mein Code tut, was Sie wollen, wie Sie eine erwartete Ausgabe nicht geben, aber ich denke, was Sie tun müssen, ist eine year Spalte hinzufügen und fügen Sie es dem group_by, so dass Sie unterscheiden zwischen Woche 46 von 2016 und Woche 46 von 2017.

Edit: falls Sie brauchen, um automatisch das Jahr von Ende-Datum zu definieren, die Sie haben, ich hinzufüge, in der Bit in Kommentar des @ docendodiscimus:

library(dplyr) 

mydataWithWeeksAndWeights <- data_frame(ended = c("14/11/2016", 
                "14/11/2016", 
                "14/11/2016", 
                "02/01/2017", 
                "02/01/2017", 
                "15/11/2017", 
                "15/11/2017", 
                "16/11/2017", 
                "16/11/2017"), 
             week = c(46, 46, 46, 1, 1, 46, 46, 46, 46), 
             satisfactionLevel = c("Very dissatisfied", 
                   "Very satisfied", 
                   "Satisfied", 
                   "Dissatisfied", 
                   "Very dissatisfied", 
                   "Very satisfied", 
                   "Very dissatisfied", 
                   "Very Satisfied", 
                   "Very satisfied"), 
             weight = c(0, 1, 0.75, 0.25, 0, 1, 0, 1, 1)) 

mydataWithWeeksAndWeights$year <- format(as.Date(mydataWithWeeksAndWeights$ended, 
               "%d/%m/%Y"), "%Y") 

pivotTable <- mydataWithWeeksAndWeights %>% 
    group_by(week, year, weight) %>% 
    count(satisfactionLevel) 
0

Hier ist, was ich tun würde: Neuformatierung "endete" in ein Datumsformat und Aggregatfunktion verwenden:

# just to shorten df-name 
df <- mydataWithWeeksAndWeights 

# reformat and add column with year 
df[,"ended"] <- as.Date(df[[1]], format = "%d/%m/%Y") 
df$year <- format(df[[1]], "%Y") 

# actual aggregating 
aggregate (df$weight, by = list(df$year, df$satisfactionLevel, df$week), FUN = sum) 

Hoffe, das hilft!