聚合R后包含列表的数据表

时间:2018-05-24 01:29:58

标签: r list data.table crosstab

这可以通过两种方式之一解决。我认为我正在使用aggregate()函数错误 - 虽然结果接近我想要的结果。

我正在使用:

WS_PART = aggregate(PART_WS_Pct$niin_id~PART_WS_Pct$ws_category,  PART_WS_Pct, FUN=function(x) unique(x))  

在某种程度上,结果几乎是我所希望的。它包含一个主要类别,然后是该类别下所有部分的列表。仅,数据的第二列是实际列表。

我基本上想为每个包含所有部分的ws_category制作一个列表。

现在数据看起来像这样:

MY_CAT1, c("000245290", "000763050", "001218656", "001506526")
MY_CAT2, c("2343","2366")

我只有几个类别,所以我认为这可能是一个很好的交叉表。类别为标题,PART#为行,每列包含某种指示符,如TRUE / FALSE或0/1。

我愿意接受更多建议,但这些是我能想到的。更糟糕的情况是,我可以将列表转换为字符并以这种方式进行一些操作吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

概述

我认为发生的事情是每个ws_category中的部件数量存在差异。要解决此问题,您必须将每个ws_cartegory的数据从一行转换为每个ws_category 相应部分的一行。

要做到这一点,请用棒球参考幽默我。许多伟大的球员从来没有为赢得世界大赛的球队效力,而有些球员似乎发现自己在他们的球员身上赢了多个戒指。

此处,df包含三行,一行用于Ron SantoHenry BlancoJohn Lester。 Santo和Blanco都没有参加过赢得世界大赛的球队。然而,莱斯特是两支冠军球队的一员。

为了扩展df以使每个棒球运动员拥有一排他们相应的世界系列赛冠军年,我们会想到两个解决方案:

  1. :使用tidyr::unnest();或

  2. baseutils个软件包同时用于stack() World Series列中未列出的对象。

  3. 代码

    # load necessary packages
    library( tidyverse )
    
    # make data
    df <-
      data.frame( Name = c("Ron Santo", "Henry Blanco", "John Lester") )
    
    # add WS Championship Years
    df$WS_Champion <-
      list( NA, NA, c(2013, 2016) )
    
    # view results
    df
    #           Name WS_Champion
    # 1    Ron Santo          NA
    # 2 Henry Blanco          NA
    # 3  John Lester  2013, 2016
    
    # base R solution
    
    # name the objects within the list column
    # with their corresponding `Name` value
    names( df$WS_Champion ) <- df$Name
    
    # unlist each object within the list column
    # and stack the vectors into a data frame
    df.stacked <-
      utils::stack( x = lapply( X = df$WS_Champion, FUN = unlist ) )
    
    # rename the columns
    colnames( df.stacked ) <- c("WS_Champion", "Name")
    
    # view results
    df.stacked
    #   WS_Champion         Name
    # 1          NA    Ron Santo
    # 2          NA Henry Blanco
    # 3        2013  John Lester
    # 4        2016  John Lester
    
    # tidyverse solution
    
    # unnest df so that 'Name' repeats for every value in 'WS_Champion'
    df <-
      unnest( data = df )
    
    # view results
    df
    #           Name WS_Champion
    # 1    Ron Santo          NA
    # 2 Henry Blanco          NA
    # 3  John Lester        2013
    # 4  John Lester        2016
    
    # end of script # 
    

    会话信息

    R version 3.4.4 (2018-03-15)
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    Running under: macOS High Sierra 10.13.2
    
    Matrix products: default
    BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
    LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib
    
    locale:
    [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods  
    [7] base     
    
    other attached packages:
    [1] forcats_0.3.0   stringr_1.3.0   dplyr_0.7.4     purrr_0.2.4    
    [5] readr_1.1.1     tidyr_0.8.0     tibble_1.4.2    ggplot2_2.2.1  
    [9] tidyverse_1.2.1
    
    loaded via a namespace (and not attached):
     [1] Rcpp_0.12.16     cellranger_1.1.0 pillar_1.2.1    
     [4] compiler_3.4.4   plyr_1.8.4       bindr_0.1.1     
     [7] tools_3.4.4      lubridate_1.7.3  jsonlite_1.5    
    [10] nlme_3.1-131.1   gtable_0.2.0     lattice_0.20-35 
    [13] pkgconfig_2.0.1  rlang_0.2.0      psych_1.7.8     
    [16] cli_1.0.0        rstudioapi_0.7   yaml_2.1.18     
    [19] parallel_3.4.4   haven_1.1.1      bindrcpp_0.2    
    [22] xml2_1.2.0       httr_1.3.1       hms_0.4.2       
    [25] grid_3.4.4       glue_1.2.0       R6_2.2.2        
    [28] readxl_1.0.0     foreign_0.8-69   modelr_0.1.1    
    [31] reshape2_1.4.3   magrittr_1.5     scales_0.5.0    
    [34] rvest_0.3.2      assertthat_0.2.0 mnormt_1.5-5    
    [37] colorspace_1.3-2 stringi_1.1.7    lazyeval_0.2.1  
    [40] munsell_0.4.3    broom_0.4.3      crayon_1.3.4