unnest_wider()
将列表列的每个元素转换为一列。它最自然地适合列表列,其中每个元素都被命名,并且行与行的名称是一致的。 unnest_wider()
保留 x
的行,同时修改列。
在vignette("rectangle")
中了解更多信息。
用法
unnest_wider(
data,
col,
names_sep = NULL,
simplify = TRUE,
strict = FALSE,
names_repair = "check_unique",
ptype = NULL,
transform = NULL
)
参数
- data
-
一个 DataFrame 。
- col
-
<
tidy-select
> 要取消嵌套的列表列。当选择多列时,同一行的值将被回收到它们的共同大小。
- names_sep
-
如果是
NULL
(默认值),名称将保持原样。如果是字符串,则外部名称和内部名称将使用names_sep
作为分隔符粘贴在一起。如果任何未嵌套的值未命名,则必须提供
names_sep
,否则将引发错误。当提供names_sep
时,会自动为未命名值生成递增的整数序列名称。 - simplify
-
如果是
TRUE
,将尝试将长度为 1 的向量列表简化为原子向量。也可以是包含TRUE
或FALSE
的命名列表,声明是否尝试简化特定列。如果提供了命名列表,则任何未指定列的默认值是TRUE
。 - strict
-
指定是否应用严格的 vctr 类型规则的单个逻辑。如果
FALSE
,则嵌套在列表列中的键入空值(如list()
或integer()
)将被视为像NULL
一样,并且不会影响未嵌套列的类型。这在使用 JSON 时非常有用,其中空值往往会丢失其类型信息并显示为list()
。 - names_repair
-
用于检查输出数据帧是否具有有效名称。必须是以下选项之一:
-
"minimal
“:没有名称修复或检查,超出基本存在, -
"unique
“:确保名称唯一且不为空, -
"check_unique
":(默认),不进行名称修复,但检查它们是否唯一, -
"universal
“:使名称具有唯一性和语法性 -
函数:应用自定义名称修复。
-
tidyr_legacy :使用 tidyr 0.8 中的名称 Repair。
-
公式:purrr-style 匿名函数(参见
rlang::as_function()
)
有关这些术语以及用于执行它们的策略的更多详细信息,请参阅
vctrs::vec_as_names()
。 -
- ptype
-
(可选)原型的命名列表,声明每个组件所需的输出类型。或者,可以提供一个空原型,它将应用于所有组件。如果您想检查每个元素是否具有您在简化时期望的类型,请使用此参数。
如果已指定
ptype
,但无法进行simplify = FALSE
或简化,则将返回 list-of 列,并且每个元素的类型为ptype
。 - transform
-
(可选)应用于每个组件的转换函数的命名列表。或者,可以提供单个函数,该函数将应用于所有组件。如果您想在提取单个元素时对其进行转换或解析,请使用此参数。
当同时提供
ptype
和transform
时,transform
在ptype
之前应用。
也可以看看
其他矩形:hoist()
、unnest_longer()
、unnest()
例子
df <- tibble(
character = c("Toothless", "Dory"),
metadata = list(
list(
species = "dragon",
color = "black",
films = c(
"How to Train Your Dragon",
"How to Train Your Dragon 2",
"How to Train Your Dragon: The Hidden World"
)
),
list(
species = "blue tang",
color = "blue",
films = c("Finding Nemo", "Finding Dory")
)
)
)
df
#> # A tibble: 2 × 2
#> character metadata
#> <chr> <list>
#> 1 Toothless <named list [3]>
#> 2 Dory <named list [3]>
# Turn all components of metadata into columns
df %>% unnest_wider(metadata)
#> # A tibble: 2 × 4
#> character species color films
#> <chr> <chr> <chr> <list>
#> 1 Toothless dragon black <chr [3]>
#> 2 Dory blue tang blue <chr [2]>
# Choose not to simplify list-cols of length-1 elements
df %>% unnest_wider(metadata, simplify = FALSE)
#> # A tibble: 2 × 4
#> character species color films
#> <chr> <list> <list> <list>
#> 1 Toothless <chr [1]> <chr [1]> <chr [3]>
#> 2 Dory <chr [1]> <chr [1]> <chr [2]>
df %>% unnest_wider(metadata, simplify = list(color = FALSE))
#> # A tibble: 2 × 4
#> character species color films
#> <chr> <chr> <list> <list>
#> 1 Toothless dragon <chr [1]> <chr [3]>
#> 2 Dory blue tang <chr [1]> <chr [2]>
# You can also widen unnamed list-cols:
df <- tibble(
x = 1:3,
y = list(NULL, 1:3, 4:5)
)
# but you must supply `names_sep` to do so, which generates automatic names:
df %>% unnest_wider(y, names_sep = "_")
#> # A tibble: 3 × 4
#> x y_1 y_2 y_3
#> <int> <int> <int> <int>
#> 1 1 NA NA NA
#> 2 2 1 2 3
#> 3 3 4 5 NA
# 0-length elements ---------------------------------------------------------
# The defaults of `unnest_wider()` treat empty types (like `list()`) as `NULL`.
json <- list(
list(x = 1:2, y = 1:2),
list(x = list(), y = 3:4),
list(x = 3L, y = list())
)
df <- tibble(json = json)
df %>%
unnest_wider(json)
#> # A tibble: 3 × 2
#> x y
#> <list> <list>
#> 1 <int [2]> <int [2]>
#> 2 <NULL> <int [2]>
#> 3 <int [1]> <NULL>
# To instead enforce strict vctrs typing rules, use `strict`
df %>%
unnest_wider(json, strict = TRUE)
#> # A tibble: 3 × 2
#> x y
#> <list> <list>
#> 1 <int [2]> <int [2]>
#> 2 <list [0]> <int [2]>
#> 3 <int [1]> <list [0]>
相关用法
- R tidyr unnest_longer 将列表列取消嵌套到行中
- R tidyr unnest 将 DataFrame 的列表列解除嵌套为行和列
- R tidyr uncount “计数” DataFrame
- R tidyr unite 通过将字符串粘贴在一起将多列合并为一列
- R tidyr separate_rows 将折叠的列分成多行
- R tidyr extract 使用正则表达式组将字符列提取为多列
- R tidyr chop 砍伐和砍伐
- R tidyr pivot_longer_spec 使用规范将数据从宽转为长
- R tidyr cms_patient_experience 来自医疗保险和医疗补助服务中心的数据
- R tidyr pivot_wider_spec 使用规范将数据从长轴转向宽轴
- R tidyr replace_na 将 NA 替换为指定值
- 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 旧名称修复
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Unnest a list-column into columns。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。