打包和解包保留数据帧的长度,改变其宽度。 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 tidyr pivot_longer_spec 使用规范将数据从宽转为长
- R tidyr pivot_wider_spec 使用规范将数据从长轴转向宽轴
- R tidyr pivot_wider 将数据从长轴转向宽轴
- R tidyr pivot_longer 将数据从宽转为长
- R tidyr separate_rows 将折叠的列分成多行
- R tidyr extract 使用正则表达式组将字符列提取为多列
- R tidyr chop 砍伐和砍伐
- R tidyr unnest_longer 将列表列取消嵌套到行中
- R tidyr uncount “计数” DataFrame
- R tidyr cms_patient_experience 来自医疗保险和医疗补助服务中心的数据
- R tidyr replace_na 将 NA 替换为指定值
- R tidyr unnest_wider 将列表列取消嵌套到列中
- R tidyr full_seq 在向量中创建完整的值序列
- R tidyr nest 将行嵌套到 DataFrame 的列表列中
- R tidyr separate 使用正则表达式或数字位置将字符列分成多列
- R tidyr nest_legacy Nest() 和 unnest() 的旧版本
- R tidyr separate_longer_delim 将字符串拆分为行
- R tidyr gather 将列收集到键值对中
- R tidyr hoist 将值提升到列表列之外
- R tidyr separate_wider_delim 将字符串拆分为列
- R tidyr drop_na 删除包含缺失值的行
- R tidyr fill 用上一个或下一个值填充缺失值
- R tidyr tidyr_legacy 旧名称修复
- R tidyr complete 完成缺少数据组合的 DataFrame
- R tidyr expand 扩展 DataFrame 以包含所有可能的值组合
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Pack and unpack。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。