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


R tidyr pack 打包和拆包


打包和解包保留數據幀的長度,改變其寬度。 pack() 通過將一組列折疊成單個 df-column 來縮小 df 的範圍。 unpack() 通過將 df-columns 擴展回各個列,使 data 變得更寬。

用法

pack(.data, ..., .names_sep = NULL, .error_call = current_env())

unpack(
  data,
  cols,
  ...,
  names_sep = NULL,
  names_repair = "check_unique",
  error_call = current_env()
)

參數

...

對於 pack() ,要打包的 < tidy-select > 列,使用 new_col = c(col1, col2, col3) 形式的 name-variable 對指定。右側可以是任何有效的整齊選擇表達式。

對於 unpack() ,這些點用於將來的擴展,並且必須為空。

data, .data

一個 DataFrame 。

cols

< tidy-select > 要解壓的列。

names_sep, .names_sep

如果是 NULL (默認值),名稱將保持原樣。在 pack() 中,內部名稱將來自以前的外部名稱;在 unpack() 中,新的外部名稱將來自內部名稱。

如果是字符串,則內部名稱和外部名稱將一起使用。在 unpack() 中,新外部列的名稱將通過將外部列名稱和內部列名稱粘貼在一起形成,並用 names_sep 分隔。在 pack() 中,新的內部名稱將自動刪除外部名稱 + names_sep。這使得 names_sep 在打包和解包之間大致對稱。

names_repair

用於檢查輸出數據幀是否具有有效名稱。必須是以下選項之一:

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

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

  • "check_unique":(默認),不進行名稱修複,但檢查它們是否唯一,

  • "universal“:使名稱具有唯一性和語法性

  • 函數:應用自定義名稱修複。

  • tidyr_legacy :使用 tidyr 0.8 中的名稱 Repair。

  • 公式:purrr-style 匿名函數(參見rlang::as_function())

有關這些術語以及用於執行它們的策略的更多詳細信息,請參閱vctrs::vec_as_names()

error_call, .error_call

當前運行函數的執行環境,例如caller_env() 。該函數將在錯誤消息中作為錯誤源被提及。有關詳細信息,請參閱 abort()call 參數。

細節

一般來說,解包比打包更有用,因為它簡化了複雜的數據結構。目前,很少有函數可以與 df-cols 一起使用,它們大多是出於好奇,但似乎值得進一步探索,因為它們模仿了 Excel 中非常流行的嵌套列標題。

例子

# Packing -------------------------------------------------------------------
# It's not currently clear why you would ever want to pack columns
# since few functions work with this sort of data.
df <- tibble(x1 = 1:3, x2 = 4:6, x3 = 7:9, y = 1:3)
df
#> # A tibble: 3 × 4
#>      x1    x2    x3     y
#>   <int> <int> <int> <int>
#> 1     1     4     7     1
#> 2     2     5     8     2
#> 3     3     6     9     3
df %>% pack(x = starts_with("x"))
#> # A tibble: 3 × 2
#>       y  x$x1   $x2   $x3
#>   <int> <int> <int> <int>
#> 1     1     1     4     7
#> 2     2     2     5     8
#> 3     3     3     6     9
df %>% pack(x = c(x1, x2, x3), y = y)
#> # A tibble: 3 × 2
#>    x$x1   $x2   $x3   y$y
#>   <int> <int> <int> <int>
#> 1     1     4     7     1
#> 2     2     5     8     2
#> 3     3     6     9     3

# .names_sep allows you to strip off common prefixes; this
# acts as a natural inverse to name_sep in unpack()
iris %>%
  as_tibble() %>%
  pack(
    Sepal = starts_with("Sepal"),
    Petal = starts_with("Petal"),
    .names_sep = "."
  )
#> # A tibble: 150 × 3
#>    Species Sepal$Length $Width Petal$Length $Width
#>    <fct>          <dbl>  <dbl>        <dbl>  <dbl>
#>  1 setosa           5.1    3.5          1.4    0.2
#>  2 setosa           4.9    3            1.4    0.2
#>  3 setosa           4.7    3.2          1.3    0.2
#>  4 setosa           4.6    3.1          1.5    0.2
#>  5 setosa           5      3.6          1.4    0.2
#>  6 setosa           5.4    3.9          1.7    0.4
#>  7 setosa           4.6    3.4          1.4    0.3
#>  8 setosa           5      3.4          1.5    0.2
#>  9 setosa           4.4    2.9          1.4    0.2
#> 10 setosa           4.9    3.1          1.5    0.1
#> # … with 140 more rows

# Unpacking -----------------------------------------------------------------
df <- tibble(
  x = 1:3,
  y = tibble(a = 1:3, b = 3:1),
  z = tibble(X = c("a", "b", "c"), Y = runif(3), Z = c(TRUE, FALSE, NA))
)
df
#> # A tibble: 3 × 3
#>       x   y$a    $b z$X      $Y $Z   
#>   <int> <int> <int> <chr> <dbl> <lgl>
#> 1     1     1     3 a     0.280 TRUE 
#> 2     2     2     2 b     0.105 FALSE
#> 3     3     3     1 c     0.746 NA   
df %>% unpack(y)
#> # A tibble: 3 × 4
#>       x     a     b z$X      $Y $Z   
#>   <int> <int> <int> <chr> <dbl> <lgl>
#> 1     1     1     3 a     0.280 TRUE 
#> 2     2     2     2 b     0.105 FALSE
#> 3     3     3     1 c     0.746 NA   
df %>% unpack(c(y, z))
#> # A tibble: 3 × 6
#>       x     a     b X         Y Z    
#>   <int> <int> <int> <chr> <dbl> <lgl>
#> 1     1     1     3 a     0.280 TRUE 
#> 2     2     2     2 b     0.105 FALSE
#> 3     3     3     1 c     0.746 NA   
df %>% unpack(c(y, z), names_sep = "_")
#> # A tibble: 3 × 6
#>       x   y_a   y_b z_X     z_Y z_Z  
#>   <int> <int> <int> <chr> <dbl> <lgl>
#> 1     1     1     3 a     0.280 TRUE 
#> 2     2     2     2 b     0.105 FALSE
#> 3     3     3     1 c     0.746 NA   
源代碼:R/pack.R

相關用法


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