当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。