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


R tidyr complete 完成缺少數據組合的 DataFrame


將隱式缺失值轉換為顯式缺失值。這是 expand()dplyr::full_join()replace_na() 的包裝,對於完成缺失的數據組合非常有用。

用法

complete(data, ..., fill = list(), explicit = TRUE)

參數

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) 等表達式。

fill

一個命名列表,為每個變量提供一個值,以代替 NA 來缺少組合。

explicit

隱式(新創建的)和顯式(預先存在的)缺失值是否都應該由 fill 填充?默認情況下,這是 TRUE ,但如果設置為 FALSE ,這會將填充限製為僅隱式缺失值。

分組 DataFrame

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

例子

df <- tibble(
  group = c(1:2, 1, 2),
  item_id = c(1:2, 2, 3),
  item_name = c("a", "a", "b", "b"),
  value1 = c(1, NA, 3, 4),
  value2 = 4:7
)
df
#> # A tibble: 4 × 5
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <chr>      <dbl>  <int>
#> 1     1       1 a              1      4
#> 2     2       2 a             NA      5
#> 3     1       2 b              3      6
#> 4     2       3 b              4      7

# Combinations --------------------------------------------------------------
# Generate all possible combinations of `group`, `item_id`, and `item_name`
# (whether or not they appear in the data)
df %>% complete(group, item_id, item_name)
#> # A tibble: 12 × 5
#>    group item_id item_name value1 value2
#>    <dbl>   <dbl> <chr>      <dbl>  <int>
#>  1     1       1 a              1      4
#>  2     1       1 b             NA     NA
#>  3     1       2 a             NA     NA
#>  4     1       2 b              3      6
#>  5     1       3 a             NA     NA
#>  6     1       3 b             NA     NA
#>  7     2       1 a             NA     NA
#>  8     2       1 b             NA     NA
#>  9     2       2 a             NA      5
#> 10     2       2 b             NA     NA
#> 11     2       3 a             NA     NA
#> 12     2       3 b              4      7

# Cross all possible `group` values with the unique pairs of
# `(item_id, item_name)` that already exist in the data
df %>% complete(group, nesting(item_id, item_name))
#> # A tibble: 8 × 5
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <chr>      <dbl>  <int>
#> 1     1       1 a              1      4
#> 2     1       2 a             NA     NA
#> 3     1       2 b              3      6
#> 4     1       3 b             NA     NA
#> 5     2       1 a             NA     NA
#> 6     2       2 a             NA      5
#> 7     2       2 b             NA     NA
#> 8     2       3 b              4      7

# Within each `group`, generate all possible combinations of
# `item_id` and `item_name` that occur in that group
df %>%
  dplyr::group_by(group) %>%
  complete(item_id, item_name)
#> # A tibble: 8 × 5
#> # Groups:   group [2]
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <chr>      <dbl>  <int>
#> 1     1       1 a              1      4
#> 2     1       1 b             NA     NA
#> 3     1       2 a             NA     NA
#> 4     1       2 b              3      6
#> 5     2       2 a             NA      5
#> 6     2       2 b             NA     NA
#> 7     2       3 a             NA     NA
#> 8     2       3 b              4      7

# Supplying values for new rows ---------------------------------------------
# Use `fill` to replace NAs with some value. By default, affects both new
# (implicit) and pre-existing (explicit) missing values.
df %>%
  complete(
    group,
    nesting(item_id, item_name),
    fill = list(value1 = 0, value2 = 99)
  )
#> # A tibble: 8 × 5
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <chr>      <dbl>  <int>
#> 1     1       1 a              1      4
#> 2     1       2 a              0     99
#> 3     1       2 b              3      6
#> 4     1       3 b              0     99
#> 5     2       1 a              0     99
#> 6     2       2 a              0      5
#> 7     2       2 b              0     99
#> 8     2       3 b              4      7

# Limit the fill to only the newly created (i.e. previously implicit)
# missing values with `explicit = FALSE`
df %>%
  complete(
    group,
    nesting(item_id, item_name),
    fill = list(value1 = 0, value2 = 99),
    explicit = FALSE
  )
#> # A tibble: 8 × 5
#>   group item_id item_name value1 value2
#>   <dbl>   <dbl> <chr>      <dbl>  <int>
#> 1     1       1 a              1      4
#> 2     1       2 a              0     99
#> 3     1       2 b              3      6
#> 4     1       3 b              0     99
#> 5     2       1 a              0     99
#> 6     2       2 a             NA      5
#> 7     2       2 b              0     99
#> 8     2       3 b              4      7
源代碼:R/complete.R

相關用法


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