切割和取消切割保留数据帧的宽度,改变其长度。 chop()
通过将每个组中的行转换为列表列来缩短 df
。 unchop()
通过扩展列表列使 df
更长,以便列表列的每个元素在输出中获得自己的行。 chop()
和 unchop()
是更复杂函数的构建块(例如 unnest()
、 unnest_longer()
和 unnest_wider()
),通常比交互式数据分析更适合编程。
用法
chop(data, cols, ..., error_call = current_env())
unchop(
data,
cols,
...,
keep_empty = FALSE,
ptype = NULL,
error_call = current_env()
)
参数
- data
-
一个 DataFrame 。
- cols
-
<
tidy-select
> 要砍伐或取消砍伐的列。对于
unchop()
,每列应该是包含广义向量的列表列(例如NULL
、原子向量、S3 向量、列表或数据帧的任意组合)。 - ...
-
这些点用于将来的扩展,并且必须为空。
- error_call
-
当前运行函数的执行环境,例如
caller_env()
。该函数将在错误消息中作为错误源被提及。有关详细信息,请参阅abort()
的call
参数。 - keep_empty
-
默认情况下,对于要取消切割/取消嵌套的列表中的每个元素,您都会获得一行输出。这意味着如果存在大小为 0 的元素(例如
NULL
或空 DataFrame 或向量),则整行将从输出中删除。如果要保留所有行,请使用keep_empty = TRUE
将 size-0 元素替换为单行缺失值。 - ptype
-
(可选)列 name-prototype 的命名列表对强制
cols
,覆盖通过组合各个值猜测的默认值。或者,可以提供单个空 ptype,它将应用于所有cols
。
细节
一般来说,unchopping 比 chopping 更有用,因为它简化了复杂的数据结构,并且 nest()
ing 通常比 chop()
ing 更合适,因为它可以更好地保留观察值之间的连接。
chop()
创建类 vctrs::list_of()
的列表列,以确保在清空切碎的数据帧时保持一致的行为。例如,这有助于在往返切碎和取消切碎之后恢复原始列类型。由于 <list_of>
会跟踪其元素的类型,因此 unchop()
甚至能够为空列表列重建正确的向量类型。
例子
# Chop ----------------------------------------------------------------------
df <- tibble(x = c(1, 1, 1, 2, 2, 3), y = 1:6, z = 6:1)
# Note that we get one row of output for each unique combination of
# non-chopped variables
df %>% chop(c(y, z))
#> # A tibble: 3 × 3
#> x y z
#> <dbl> <list<int>> <list<int>>
#> 1 1 [3] [3]
#> 2 2 [2] [2]
#> 3 3 [1] [1]
# cf nest
df %>% nest(data = c(y, z))
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 2]>
#> 2 2 <tibble [2 × 2]>
#> 3 3 <tibble [1 × 2]>
# Unchop --------------------------------------------------------------------
df <- tibble(x = 1:4, y = list(integer(), 1L, 1:2, 1:3))
df %>% unchop(y)
#> # A tibble: 6 × 2
#> x y
#> <int> <int>
#> 1 2 1
#> 2 3 1
#> 3 3 2
#> 4 4 1
#> 5 4 2
#> 6 4 3
df %>% unchop(y, keep_empty = TRUE)
#> # A tibble: 7 × 2
#> x y
#> <int> <int>
#> 1 1 NA
#> 2 2 1
#> 3 3 1
#> 4 3 2
#> 5 4 1
#> 6 4 2
#> 7 4 3
# unchop will error if the types are not compatible:
df <- tibble(x = 1:2, y = list("1", 1:3))
try(df %>% unchop(y))
#> Error in list_unchop(col, ptype = col_ptype) :
#> Can't combine `x[[1]]` <character> and `x[[2]]` <integer>.
# Unchopping a list-col of data frames must generate a df-col because
# unchop leaves the column names unchanged
df <- tibble(x = 1:3, y = list(NULL, tibble(x = 1), tibble(y = 1:2)))
df %>% unchop(y)
#> # A tibble: 3 × 2
#> x y$x $y
#> <int> <dbl> <int>
#> 1 2 1 NA
#> 2 3 NA 1
#> 3 3 NA 2
df %>% unchop(y, keep_empty = TRUE)
#> # A tibble: 4 × 2
#> x y$x $y
#> <int> <dbl> <int>
#> 1 1 NA NA
#> 2 2 1 NA
#> 3 3 NA 1
#> 4 3 NA 2
相关用法
- R tidyr cms_patient_experience 来自医疗保险和医疗补助服务中心的数据
- R tidyr complete 完成缺少数据组合的 DataFrame
- R tidyr separate_rows 将折叠的列分成多行
- R tidyr extract 使用正则表达式组将字符列提取为多列
- R tidyr pivot_longer_spec 使用规范将数据从宽转为长
- R tidyr unnest_longer 将列表列取消嵌套到行中
- R tidyr uncount “计数” DataFrame
- 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 旧名称修复
- R tidyr expand 扩展 DataFrame 以包含所有可能的值组合
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Chop and unchop。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。