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


R tidyr unnest_wider 将列表列取消嵌套到列中


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 的向量列表简化为原子向量。也可以是包含 TRUEFALSE 的命名列表,声明是否尝试简化特定列。如果提供了命名列表,则任何未指定列的默认值是 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

(可选)应用于每个组件的转换函数的命名列表。或者,可以提供单个函数,该函数将应用于所有组件。如果您想在提取单个元素时对其进行转换或解析,请使用此参数。

当同时提供 ptypetransform 时,transformptype 之前应用。

也可以看看

其他矩形: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/unnest-wider.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Unnest a list-column into columns。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。