2017-01-30 3 views
0

Ich bin vor kurzem von Stata nach R migriert. Ich bin mir nicht sicher, wie man beschreibende Statistiken über gruppierte und ungruppierte Beobachtungen berechnen kann.Deskriptive Statistiken über gruppierte und ungruppierte Beobachtungen

Hier ist meine Daten:

dput(DF) 
structure(list(Product_Name = c("iPhone", "iPhone", "iPhone", 
"iPhone", "iPhone", "iPhone", "Nexus 6P", "Nexus 6P", "Nexus 6P", 
"Nexus 6P", "Nexus 6P", "Nexus 6P"), Product_Type = c("New", 
"New", "Refurbished", "New", "New", "Refurbished", "Refurbished", 
"Refurbished", "Refurbished", "Refurbished", "Refurbished", "Refurbished" 
), Year = c(2006, 2011, 2009, 2008, 2011, 2009, 2012, 2007, 2013, 
2015, 2009, 2010), Units = c(100, 200, 300, 400, 500, 600, 700, 
200, 120, 125, 345, 340)), .Names = c("Product_Name", "Product_Type", 
"Year", "Units"), row.names = c(NA, 12L), class = "data.frame") 

Meine Daten hat nach Jahr und Art verkauften Produkte. Jedes Produkt könnte ein überholtes Produkt oder ein neues Produkt sein. Wenn es vor 2010 verkauft wurde, würde ich es als "Time 1" verkaufen, ansonsten würde ich es als "Time 2" verkaufen.

Hier ist mein Code dafür:

DF[DF$Year<2010,"Time"]<-"1" 
DF[DF$Year>=2010,"Time"]<-"2" 

Nun, ich deskriptiven Statistiken für diese Zeiträume generieren möchten.

DF %>% 
    group_by(Product_Name, Product_Type,Time) %>% 
    dplyr::summarise(Count = n(), 
        Sum_Units = sum(Units,na.rm=TRUE), 
        Avg_Units = mean(Units,na.rm = TRUE), 
        Max_Units=max(Units,na.rm = TRUE)) 

Wenn wir oben Code ausführen, würden wir deskriptive Statistik von Product_Name, Product_Type, erhalten und Time (d gruppierten deskriptive Statistik). Dies ist jedoch nicht das, was ich will. Ich möchte deskriptive Statistiken mit und ohne Berücksichtigung von Gruppierungen mit Product_Type und Time. Das heißt, ich würde deskriptive Statistiken unter der Annahme berechnen, dass Produkte in Zeit 1 ODER Zeit 2 (d. H. Alle Jahre) und unabhängig von der Art des verkauften Produkts verkauft wurden, während einige der oben genannten gruppierten Informationen beibehalten wurden.

Erwarteter Ausgang:

dput(DFOut) 
structure(list(Product_Name = c("iPhone", "Nexus 6P"), New_Units_Sum_Time1 = c(500, 
NA), Refurbished_Units_Sum_Time_1 = c(900, 545), Sum_Units_Time1 = c(1400, 
545), Sum_Units_Time2 = c(700, 1285), Sum_Units_Time_1_And_2 = c(2100, 
1830), Avg_Units_Time1 = c(350, 272.5), Avg_Units_Time2 = c(350, 
321.25), Avg_Units_Time_1_And_2 = c(350, 305), Max_Units_Time1 = c(600, 
345), Max_Units_Time2 = c(500, 700), Max_Units_Time_1_And_2 = c(600, 
700)), .Names = c("Product_Name", "New_Units_Sum_Time1", "Refurbished_Units_Sum_Time_1", 
"Sum_Units_Time1", "Sum_Units_Time2", "Sum_Units_Time_1_And_2", 
"Avg_Units_Time1", "Avg_Units_Time2", "Avg_Units_Time_1_And_2", 
"Max_Units_Time1", "Max_Units_Time2", "Max_Units_Time_1_And_2" 
), row.names = 1:2, class = "data.frame") 

In der Ausgabe, würden Sie sehen, dass ich einige der deskriptiven Statistik haben:

a) auf der Grundlage der Art des Produkts und die Zeit es verkauft wurde (zB New_Units_Sum_Time1 dh New und Time1). Bitte beachten Sie, dass ich in der Ausgabe nur die Kombination New und Time1 gezeigt habe. Wenn Sie mich führen können, um deskriptive Statistiken für andere Kombinationen von Refurbished und Time zu produzieren, wäre es großartig.

b), bezogen auf Produkttyp ignoriert, aber nicht die Zeit ignoriert verkauft (z.B. Sum_Units_Time1 d.h. Time1)

c) auf der Grundlage sowohl Art von Produkt zu ignorieren und die Periode es verkauft wurde (z.B. Sum_Units_Time_1_And_2).

Dito für Durchschnitt und Mittelwert.

Wie kann ich das tun? Ich würde mich über jede Hilfe freuen. Ich habe wirklich Probleme damit.


Bitte beachten Sie, dass ich DFOut manuell mit Excel erstellt habe. Obwohl ich es dreifach überprüfte, könnte es einige manuelle Fehler geben - ich werde mehr als glücklich sein, sie zu klären, wenn es Fragen gibt. Vielen Dank für Ihre Zeit.


Session()

R version 3.3.2 (2016-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows >= 8 x64 (build 9200) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] grDevices datasets stats  graphics grid  tcltk  utils  methods base  

other attached packages: 
[1] tables_0.8    Hmisc_4.0-2    Formula_1.2-1   survival_2.40-1   
[5] ResourceSelection_0.3-0 magrittr_1.5   stringr_1.1.0   bit64_0.9-5    
[9] bit_1.1-12    tufterhandout_1.2.1  knitr_1.15.1   rmarkdown_1.3   
[13] tufte_0.2    corrplot_0.77   purrr_0.2.2    readr_1.0.0    
[17] tibble_1.2    tidyverse_1.1.1   cowplot_0.7.0   plotly_4.5.6   
[21] ggplot2_2.2.1   maps_3.1.1    directlabels_2015.12.16 tidyr_0.6.1    
[25] ggthemes_3.3.0   R2HTML_2.3.2   lubridate_1.6.0   xts_0.9-7    
[29] zoo_1.7-14    lattice_0.20-34   corrgram_1.10   hexbin_1.27.1   
[33] sm_2.2-5.4    compare_0.2-6   installr_0.18.0   psych_1.6.12   
[37] reshape2_1.4.2   readstata13_0.8.5  pastecs_1.3-18   boot_1.3-18    
[41] vcd_1.4-3    car_2.1-4    xlsxjars_0.6.1   rJava_0.9-8    
[45] debug_1.3.1    dplyr_0.5.0    foreign_0.8-67   gmodels_2.16.2   
[49] openxlsx_4.0.0   plyr_1.8.4    

loaded via a namespace (and not attached): 
[1] minqa_1.2.4   colorspace_1.3-2 class_7.3-14  modeltools_0.2-21 mclust_5.2.2  
[6] rprojroot_1.2  htmlTable_1.9  base64enc_0.1-3  MatrixModels_0.4-1 flexmix_2.3-13  
[11] mvtnorm_1.0-5  xml2_1.1.1   codetools_0.2-15 splines_3.3.2  mnormt_1.5-5  
[16] robustbase_0.92-7 jsonlite_1.2  nloptr_1.0.4  pbkrtest_0.4-6  broom_0.4.1   
[21] cluster_2.0.5  kernlab_0.9-25  httr_1.2.1   backports_1.0.5  assertthat_0.1  
[26] Matrix_1.2-7.1  lazyeval_0.2.0  acepack_1.4.1  htmltools_0.3.5  quantreg_5.29  
[31] tools_3.3.2   gtable_0.2.0  Rcpp_0.12.9   trimcluster_0.1-2 gdata_2.17.0  
[36] nlme_3.1-128  iterators_1.0.8  fpc_2.1-10   lmtest_0.9-34  lme4_1.1-12   
[41] rvest_0.3.2   gtools_3.5.0  dendextend_1.4.0 DEoptimR_1.0-8  MASS_7.3-45   
[46] scales_0.4.1  TSP_1.1-4   hms_0.3    parallel_3.3.2  SparseM_1.74  
[51] RColorBrewer_1.1-2 gridExtra_2.2.1  rpart_4.1-10  latticeExtra_0.6-28 stringi_1.1.2  
[56] gclus_1.3.1   mvbutils_2.7.4.1 foreach_1.4.3  checkmate_1.8.2  seriation_1.2-1  
[61] caTools_1.17.1  prabclus_2.2-6  bitops_1.0-6  evaluate_0.10  htmlwidgets_0.8  
[66] R6_2.2.0   gplots_3.0.1  DBI_0.5-1   haven_1.0.0   whisker_0.3-2  
[71] mgcv_1.8-16   nnet_7.3-12   modelr_0.1.0  KernSmooth_2.23-15 viridis_0.3.4  
[76] readxl_0.1.1  data.table_1.10.0 forcats_0.2.0  digest_0.6.12  diptest_0.75-7  
[81] stats4_3.3.2  munsell_0.4.3  registry_0.3  viridisLite_0.1.3 quadprog_1.5-5  
+1

Also im Grunde brauchen Sie jedes Mal unterschiedliche Gruppierungsvariable ...? Eine Reihe von 'group_by%>% ...%>% ungroup() ....%>% ... group_by..'? – Sotos

+0

@Sotos - Nochmals vielen Dank für Ihre Hilfe, wie immer. Ja, die einzige Klarstellung, die ich hinzufügen würde, ist, dass es mehrere Schichten gibt: deskriptive Statistiken von a) gruppiert basierend auf Produktname, Zeit und Typ b) gruppiert basierend auf Produktname, Zeit c) gruppiert basierend auf dem Produktnamen. Hilft das? – watchtower

+1

Nun, ja. Genau das habe ich verstanden :) – Sotos

Antwort

2

Eine Möglichkeit zur Automatisierung ist dies zunächst einen Vektor (ind) mit allen möglichen Kombinationen Ihrer Gruppenvariablen zu erstellen. Wir nehmen dann diese Kombinationen und konvertieren sie in Formel mit Units. Da jede Formel in einer Liste gespeichert wird (l1), durchlaufen wir diese Liste und aggregieren.

ind <- unlist(sapply(c(2,3), function(i) combn(c('Product_Name', 'Product_Type', 'Time'), 
                  i, paste, collapse = '+'))) 

l1 <- sapply(ind, function(i) as.formula(paste('Units ~ ', i))) 

lapply(l1, function(i) aggregate(i, df, FUN = function(j) c(sum1 = sum(j), 
                  avg = mean(j), 
                  max_units = max(j)))) 

#which gives 

#$`Product_Name+Product_Type` 
# Product_Name Product_Type Units.sum1 Units.avg Units.max_units 
#1  iPhone   New  1200  300    500 
#2  iPhone Refurbished  900  450    600 
#3  Nexus 6P Refurbished  1830  305    700 

#$`Product_Name+Time` 
# Product_Name Time Units.sum1 Units.avg Units.max_units 
#1  iPhone 1 1400.00 350.00   600.00 
#2  Nexus 6P 1  545.00 272.50   345.00 
#3  iPhone 2  700.00 350.00   500.00 
#4  Nexus 6P 2 1285.00 321.25   700.00 

#$`Product_Type+Time` 
# Product_Type Time Units.sum1 Units.avg Units.max_units 
#1   New 1  500.00 250.00   400.00 
#2 Refurbished 1 1445.00 361.25   600.00 
#3   New 2  700.00 350.00   500.00 
#4 Refurbished 2 1285.00 321.25   700.00 

#$`Product_Name+Product_Type+Time` 
# Product_Name Product_Type Time Units.sum1 Units.avg Units.max_units 
#1  iPhone   New 1  500.00 250.00   400.00 
#2  iPhone Refurbished 1  900.00 450.00   600.00 
#3  Nexus 6P Refurbished 1  545.00 272.50   345.00 
#4  iPhone   New 2  700.00 350.00   500.00 
#5  Nexus 6P Refurbished 2 1285.00 321.25   700.00 
+0

Danke Sotos ... Ich habe deine 'df' in' DF1' geändert, und ich bekomme diesen Fehler: 'Fehler in eval (expr, envir, enclos): Objekt 'Einheiten' nicht gefunden' . Hier ist Traceback: '10. eval (expr, envir, enclos) 9.eval (Vorvars, Daten, env) 8.model.frame.default (Formel = i, Daten = DF1) 7.stats :: model.frame (Formel = i, data = DF1) 6.eval (expr, envir, enclos) 5.eval (m, parent.frame()) 4.aggregate.formula (i, DF1, FUN = Funktion (j) c (sum1 = Summe (j), avg = mittel (j), max_units = max (j))) 3.aggregate (i, DF1, ..2. FUN (X [[i]], ...) 1. lapply (l1, Funktion (i) Aggregat (i, DF1, .. – watchtower

+0

hmm ... weiß nicht. Seltsam. Es funktioniert perfekt hier. Ist alles, was Sie verwenden, auf dem neuesten Stand? – Sotos

+0

Ich habe meine Pakete hinzugefügt. Ich hoffe, etwas stimmt nicht mit meinem R install. – watchtower

Verwandte Themen