【问题标题】:Descriptive statistics on grouped and ungrouped observations分组和未分组观察的描述性统计
【发布时间】:2017-06-15 06:59:48
【问题描述】:

我最近从 Stata 迁移到 R。我不确定如何对分组和未分组的观察结果执行计算描述性统计。

这是我的数据:

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")

我的数据包含按年份和类型销售的产品。每个产品都可以是翻新产品或新产品。此外,如果它在 2010 年之前售出,我会将其标记为在“时间 1”中售出,否则我会将其标记为在“时间 2”中售出。

这是我的代码:

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

现在,我想为这些时间段生成描述性统计数据。

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))

如果我们运行上面的代码,我们将通过Product_NameProduct_TypeTime 获得描述性统计信息(即分组描述性统计信息)。然而,这不是我想要的。我想要描述性统计数据,考虑和不考虑Product_TypeTime 的分组。意思是,我想计算描述性统计数据,假设产品在时间 1 或时间 2(即所有年份)销售,无论销售的产品类型如何,同时保留上面的一些分组信息。

预期输出:

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")

在输出中,您会看到我有一些描述性统计数据:

a) 基于产品类型和销售时间(例如New_Units_Sum_Time1,即NewTime1)。请注意,在输出中,我只显示了NewTime1 的组合。如果您能指导我如何为RefurbishedTime 的其他组合生成描述性统计数据,那就太棒了。

b) 基于忽略产品类型但不忽略销售期(例如Sum_Units_Time1Time1

c) 基于忽略产品类型和销售时间(例如Sum_Units_Time_1_And_2)。

Avg 和 Mean 同上。

我该怎么做?我会很感激任何帮助。我真的在这方面苦苦挣扎。


请注意,我使用 Excel 手动创建了 DFOut。虽然我检查了三次,但可能存在一些手动错误——如果有问题,我会非常乐意澄清它们。感谢您的宝贵时间。


sessionInfo()

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    

【问题讨论】:

  • 所以基本上你每次都需要不同的分组变量......?一系列group_by %&gt;% ... %&gt;% ungroup() ....%&gt;%... group_by..?
  • @Sotos - 一如既往地再次感谢您的帮助。是的,我要补充的唯一说明是有多个层次:描述性统计 a)根据产品名称、时间和类型分组 b)根据产品名称分组,时间 c)根据产品名称分组。这有帮助吗?
  • 嗯,是的。这正是我所理解的:)

标签: r dplyr


【解决方案1】:

自动执行此操作的一种方法是首先创建一个向量 (ind),其中包含所有可能的分组变量组合。然后我们采用这些组合并将它们转换为带有Units 的公式。由于每个公式都保存在一个列表 (l1) 中,我们遍历该列表并聚合。

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

【讨论】:

  • 感谢 Sotos...我将您的 df 更改为 DF1,我收到此错误:Error in eval(expr, envir, enclos) : object 'Units' not found。这是回溯:`10。 eval(expr, envir, enclos) 9.eval(predvars, data, env) 8.model.frame.default(formula = i, data = DF1) 7.stats::model.frame(formula = i, data = DF1 ) 6.eval(expr, envir, enclos) 5.eval(m, parent.frame()) 4.aggregate.formula(i, DF1, FUN = function(j) c(sum1 = sum(j), avg = mean(j), max_units = max(j))) 3.aggregate(i, DF1, ..2.FUN(X[[i]], ...) 1. lapply(l1, function(i) aggregate(我,DF1,..
  • 嗯...不知道。诡异的。它在这里完美运行。您使用的一切都是最新的吗?
  • 我已经添加了我的包裹。我希望我的 R 安装没有问题。
  • 好的。知道了。 DF1 在我的代码中应该是 DF。你的代码没有错。我的错。
  • 最后一个问题:有什么方法可以将所有列表合并为一个,类似于我发布的输出?例如,每个Product Name 只有两行。任何想法?我问是因为我想比较“时间 1”、“时间 2”和“时间 1 + 时间 2”的描述性统计数据。我正在考虑按行进行比较,为此,我需要一个 data.frame 或列表中的所有列。
猜你喜欢
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
相关资源
最近更新 更多