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
> 要擴展或完成的列規範。列可以是原子向量或列表。-
要查找
x
、y
和z
的所有唯一組合(包括數據中不存在的組合),請將每個變量作為單獨的參數提供: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:2020
或year = 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 tidyr expand_grid 從所有輸入組合創建一個 tibble
- R tidyr extract 使用正則表達式組將字符列提取為多列
- R tidyr separate_rows 將折疊的列分成多行
- R tidyr chop 砍伐和砍伐
- R tidyr pivot_longer_spec 使用規範將數據從寬轉為長
- R tidyr unnest_longer 將列表列取消嵌套到行中
- R tidyr uncount “計數” DataFrame
- R tidyr cms_patient_experience 來自醫療保險和醫療補助服務中心的數據
- R tidyr pivot_wider_spec 使用規範將數據從長軸轉向寬軸
- R tidyr replace_na 將 NA 替換為指定值
- R tidyr unnest_wider 將列表列取消嵌套到列中
- R tidyr full_seq 在向量中創建完整的值序列
- R tidyr nest 將行嵌套到 DataFrame 的列表列中
- R tidyr separate 使用正則表達式或數字位置將字符列分成多列
- R tidyr pivot_wider 將數據從長軸轉向寬軸
- R tidyr nest_legacy Nest() 和 unnest() 的舊版本
- R tidyr separate_longer_delim 將字符串拆分為行
- R tidyr gather 將列收集到鍵值對中
- R tidyr hoist 將值提升到列表列之外
- R tidyr pivot_longer 將數據從寬轉為長
- R tidyr pack 打包和拆包
- R tidyr separate_wider_delim 將字符串拆分為列
- R tidyr drop_na 刪除包含缺失值的行
- R tidyr fill 用上一個或下一個值填充缺失值
- R tidyr tidyr_legacy 舊名稱修複
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Expand data frame to include all possible combinations of values。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。