當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R tidyr expand 擴展 DataFrame 以包含所有可能的值組合


expand() 生成數據集中找到的所有變量組合。它與 nesting()crossing() 幫助程序配對。 crossing()expand_grid() 和 de-duplicates 的包裝器,並對其輸入進行排序; nesting() 是一個助手,僅查找數據中已存在的組合。

expand() 通常與連接結合使用:

  • 將其與 right_join() 一起使用,將隱式缺失值轉換為顯式缺失值(例如,填充 DataFrame 中的空白)。

  • 將其與 anti_join() 一起使用來找出缺少哪些組合(例如,識別 DataFrame 中的間隙)。

用法

expand(data, ..., .name_repair = "check_unique")

crossing(..., .name_repair = "check_unique")

nesting(..., .name_repair = "check_unique")

參數

data

一個 DataFrame 。

...

< data-masking > 要擴展或完成的列規範。列可以是原子向量或列表。

  • 要查找 xyz 的所有唯一組合(包括數據中不存在的組合),請將每個變量作為單獨的參數提供: expand(df, x, y, z)complete(df, x, y, z)

  • 要僅查找數據中出現的組合,請使用 nesting : expand(df, nesting(x, y, z))

  • 您可以將這兩種形式結合起來。例如,expand(df, nesting(school_id, student_id), date) 將為所有可能日期的每個當前 school-student 組合生成一行。

與因子一起使用時,expand()complete() 使用完整的級別集,而不僅僅是數據中出現的級別。如果您隻想使用數據中看到的值,請使用 forcats::fct_drop()

與連續變量一起使用時,您可能需要填充數據中未出現的值:為此,請使用 year = 2010:2020year = full_seq(year,1) 等表達式。

.name_repair

有問題的列名的處理:

  • "minimal":沒有名稱修複或檢查,超出基本存在,

  • "unique" :確保名稱唯一且不為空,

  • "check_unique" :(默認值),沒有名稱修複,但檢查它們是 unique

  • "universal" :命名為 unique 和語法

  • 函數:應用自定義名稱修複(例如,.name_repair = make.names 用於基本 R 樣式的名稱)。

  • purrr-style 匿名函數,請參閱rlang::as_function()

此參數作為 repair 傳遞到 vctrs::vec_as_names() 。有關這些條款以及用於執行這些條款的策略的更多詳細信息,請參閱此處。

分組 DataFrame

通過 dplyr::group_by() 創建的分組數據幀,expand() 在每個組內運行。因此,您無法擴展分組列。

也可以看看

complete() 展開列表對象。 expand_grid() 輸入向量而不是數據幀。

例子

# Finding combinations ------------------------------------------------------
fruits <- tibble(
  type = c("apple", "orange", "apple", "orange", "orange", "orange"),
  year = c(2010, 2010, 2012, 2010, 2011, 2012),
  size = factor(
    c("XS", "S", "M", "S", "S", "M"),
    levels = c("XS", "S", "M", "L")
  ),
  weights = rnorm(6, as.numeric(size) + 2)
)

# All combinations, including factor levels that are not used
fruits %>% expand(type)
#> # A tibble: 2 × 1
#>   type  
#>   <chr> 
#> 1 apple 
#> 2 orange
fruits %>% expand(size)
#> # A tibble: 4 × 1
#>   size 
#>   <fct>
#> 1 XS   
#> 2 S    
#> 3 M    
#> 4 L    
fruits %>% expand(type, size)
#> # A tibble: 8 × 2
#>   type   size 
#>   <chr>  <fct>
#> 1 apple  XS   
#> 2 apple  S    
#> 3 apple  M    
#> 4 apple  L    
#> 5 orange XS   
#> 6 orange S    
#> 7 orange M    
#> 8 orange L    
fruits %>% expand(type, size, year)
#> # A tibble: 24 × 3
#>    type  size   year
#>    <chr> <fct> <dbl>
#>  1 apple XS     2010
#>  2 apple XS     2011
#>  3 apple XS     2012
#>  4 apple S      2010
#>  5 apple S      2011
#>  6 apple S      2012
#>  7 apple M      2010
#>  8 apple M      2011
#>  9 apple M      2012
#> 10 apple L      2010
#> # … with 14 more rows

# Only combinations that already appear in the data
fruits %>% expand(nesting(type))
#> # A tibble: 2 × 1
#>   type  
#>   <chr> 
#> 1 apple 
#> 2 orange
fruits %>% expand(nesting(size))
#> # A tibble: 3 × 1
#>   size 
#>   <fct>
#> 1 XS   
#> 2 S    
#> 3 M    
fruits %>% expand(nesting(type, size))
#> # A tibble: 4 × 2
#>   type   size 
#>   <chr>  <fct>
#> 1 apple  XS   
#> 2 apple  M    
#> 3 orange S    
#> 4 orange M    
fruits %>% expand(nesting(type, size, year))
#> # A tibble: 5 × 3
#>   type   size   year
#>   <chr>  <fct> <dbl>
#> 1 apple  XS     2010
#> 2 apple  M      2012
#> 3 orange S      2010
#> 4 orange S      2011
#> 5 orange M      2012

# Other uses ----------------------------------------------------------------
# Use with `full_seq()` to fill in values of continuous variables
fruits %>% expand(type, size, full_seq(year, 1))
#> # A tibble: 24 × 3
#>    type  size  `full_seq(year, 1)`
#>    <chr> <fct>               <dbl>
#>  1 apple XS                   2010
#>  2 apple XS                   2011
#>  3 apple XS                   2012
#>  4 apple S                    2010
#>  5 apple S                    2011
#>  6 apple S                    2012
#>  7 apple M                    2010
#>  8 apple M                    2011
#>  9 apple M                    2012
#> 10 apple L                    2010
#> # … with 14 more rows
fruits %>% expand(type, size, 2010:2013)
#> # A tibble: 32 × 3
#>    type  size  `2010:2013`
#>    <chr> <fct>       <int>
#>  1 apple XS           2010
#>  2 apple XS           2011
#>  3 apple XS           2012
#>  4 apple XS           2013
#>  5 apple S            2010
#>  6 apple S            2011
#>  7 apple S            2012
#>  8 apple S            2013
#>  9 apple M            2010
#> 10 apple M            2011
#> # … with 22 more rows

# Use `anti_join()` to determine which observations are missing
all <- fruits %>% expand(type, size, year)
all
#> # A tibble: 24 × 3
#>    type  size   year
#>    <chr> <fct> <dbl>
#>  1 apple XS     2010
#>  2 apple XS     2011
#>  3 apple XS     2012
#>  4 apple S      2010
#>  5 apple S      2011
#>  6 apple S      2012
#>  7 apple M      2010
#>  8 apple M      2011
#>  9 apple M      2012
#> 10 apple L      2010
#> # … with 14 more rows
all %>% dplyr::anti_join(fruits)
#> Joining, by = c("type", "size", "year")
#> # A tibble: 19 × 3
#>    type   size   year
#>    <chr>  <fct> <dbl>
#>  1 apple  XS     2011
#>  2 apple  XS     2012
#>  3 apple  S      2010
#>  4 apple  S      2011
#>  5 apple  S      2012
#>  6 apple  M      2010
#>  7 apple  M      2011
#>  8 apple  L      2010
#>  9 apple  L      2011
#> 10 apple  L      2012
#> 11 orange XS     2010
#> 12 orange XS     2011
#> 13 orange XS     2012
#> 14 orange S      2012
#> 15 orange M      2010
#> 16 orange M      2011
#> 17 orange L      2010
#> 18 orange L      2011
#> 19 orange L      2012

# Use with `right_join()` to fill in missing rows (like `complete()`)
fruits %>% dplyr::right_join(all)
#> Joining, by = c("type", "year", "size")
#> # A tibble: 25 × 4
#>    type    year size  weights
#>    <chr>  <dbl> <fct>   <dbl>
#>  1 apple   2010 XS       5.21
#>  2 orange  2010 S        2.88
#>  3 apple   2012 M        3.80
#>  4 orange  2010 S        4.47
#>  5 orange  2011 S        3.24
#>  6 orange  2012 M        3.55
#>  7 apple   2011 XS      NA   
#>  8 apple   2012 XS      NA   
#>  9 apple   2010 S       NA   
#> 10 apple   2011 S       NA   
#> # … with 15 more rows

# Use with `group_by()` to expand within each group
fruits %>%
  dplyr::group_by(type) %>%
  expand(year, size)
#> # A tibble: 20 × 3
#> # Groups:   type [2]
#>    type    year size 
#>    <chr>  <dbl> <fct>
#>  1 apple   2010 XS   
#>  2 apple   2010 S    
#>  3 apple   2010 M    
#>  4 apple   2010 L    
#>  5 apple   2012 XS   
#>  6 apple   2012 S    
#>  7 apple   2012 M    
#>  8 apple   2012 L    
#>  9 orange  2010 XS   
#> 10 orange  2010 S    
#> 11 orange  2010 M    
#> 12 orange  2010 L    
#> 13 orange  2011 XS   
#> 14 orange  2011 S    
#> 15 orange  2011 M    
#> 16 orange  2011 L    
#> 17 orange  2012 XS   
#> 18 orange  2012 S    
#> 19 orange  2012 M    
#> 20 orange  2012 L    
源代碼:R/expand.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Expand data frame to include all possible combinations of values。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。