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


R tidyr unnest_longer 将列表列取消嵌套到行中


unnest_longer() 将列表列的每个元素转换为行。它最自然地适合列表列,其中元素未命名并且每个元素的长度随行而变化。

unnest_longer()一般在修改行数的同时保留x的列数。

vignette("rectangle") 中了解更多信息。

用法

unnest_longer(
  data,
  col,
  values_to = NULL,
  indices_to = NULL,
  indices_include = NULL,
  keep_empty = FALSE,
  names_repair = "check_unique",
  simplify = TRUE,
  ptype = NULL,
  transform = NULL
)

参数

data

一个 DataFrame 。

col

< tidy-select > 要取消嵌套的列表列。

当选择多列时,同一行的值将被回收到它们的共同大小。

values_to

给出用于存储未嵌套值的列名称的字符串。如果在 col 中指定了多个列,则这也可以是包含 "{col}" 的粘合字符串,以提供列名称的模板。默认值 NULL 为输出列提供与输入列相同的名称。

indices_to

给出列名(或多个名称)的字符串,用于存储值的内部名称或位置(如果未命名)。如果在 col 中指定了多个列,则这也可以是包含 "{col}" 的粘合字符串,以提供列名称的模板。默认值 NULL 为输出列提供与 values_to 相同的名称,但后缀为 "_id"

indices_include

指定是否添加索引列的单个逻辑值。如果任何值具有内部名称,则索引列将是这些名称的字符向量,否则它将是位置的整数向量。如果 NULL ,如果任何值具有内部名称或者提供了 indices_to,则默认为 TRUE

如果提供 indices_to ,则 indices_include 不能是 FALSE

keep_empty

默认情况下,对于要取消切割/取消嵌套的列表中的每个元素,您都会获得一行输出。这意味着如果存在大小为 0 的元素(例如 NULL 或空 DataFrame 或向量),则整行将从输出中删除。如果要保留所有行,请使用 keep_empty = TRUE 将 size-0 元素替换为单行缺失值。

names_repair

用于检查输出数据帧是否具有有效名称。必须是以下选项之一:

  • "minimal“:没有名称修复或检查,超出基本存在,

  • "unique“:确保名称唯一且不为空,

  • "check_unique":(默认),不进行名称修复,但检查它们是否唯一,

  • "universal“:使名称具有唯一性和语法性

  • 函数:应用自定义名称修复。

  • tidyr_legacy :使用 tidyr 0.8 中的名称 Repair。

  • 公式:purrr-style 匿名函数(参见rlang::as_function())

有关这些术语以及用于执行它们的策略的更多详细信息,请参阅vctrs::vec_as_names()

simplify

如果是 TRUE ,将尝试将长度为 1 的向量列表简化为原子向量。也可以是包含 TRUEFALSE 的命名列表,声明是否尝试简化特定列。如果提供了命名列表,则任何未指定列的默认值是 TRUE

ptype

(可选)原型的命名列表,声明每个组件所需的输出类型。或者,可以提供一个空原型,它将应用于所有组件。如果您想检查每个元素是否具有您在简化时期望的类型,请使用此参数。

如果已指定 ptype,但无法进行 simplify = FALSE 或简化,则将返回 list-of 列,并且每个元素的类型为 ptype

transform

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

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

也可以看看

其他矩形:hoist()unnest_wider()unnest()

例子

# `unnest_longer()` is useful when each component of the list should
# form a row
df <- tibble(
  x = 1:4,
  y = list(NULL, 1:3, 4:5, integer())
)
df %>% unnest_longer(y)
#> # A tibble: 5 × 2
#>       x     y
#>   <int> <int>
#> 1     2     1
#> 2     2     2
#> 3     2     3
#> 4     3     4
#> 5     3     5

# Note that empty values like `NULL` and `integer()` are dropped by
# default. If you'd like to keep them, set `keep_empty = TRUE`.
df %>% unnest_longer(y, keep_empty = TRUE)
#> # A tibble: 7 × 2
#>       x     y
#>   <int> <int>
#> 1     1    NA
#> 2     2     1
#> 3     2     2
#> 4     2     3
#> 5     3     4
#> 6     3     5
#> 7     4    NA

# If the inner vectors are named, the names are copied to an `_id` column
df <- tibble(
  x = 1:2,
  y = list(c(a = 1, b = 2), c(a = 10, b = 11, c = 12))
)
df %>% unnest_longer(y)
#> # A tibble: 5 × 3
#>       x     y y_id 
#>   <int> <dbl> <chr>
#> 1     1     1 a    
#> 2     1     2 b    
#> 3     2    10 a    
#> 4     2    11 b    
#> 5     2    12 c    

# Multiple columns ----------------------------------------------------------
# If columns are aligned, you can unnest simultaneously
df <- tibble(
  x = 1:2,
  y = list(1:2, 3:4),
  z = list(5:6, 7:8)
)
df %>%
  unnest_longer(c(y, z))
#> # A tibble: 4 × 3
#>       x     y     z
#>   <int> <int> <int>
#> 1     1     1     5
#> 2     1     2     6
#> 3     2     3     7
#> 4     2     4     8

# This is important because sequential unnesting would generate the
# Cartesian product of the rows
df %>%
  unnest_longer(y) %>%
  unnest_longer(z)
#> # A tibble: 8 × 3
#>       x     y     z
#>   <int> <int> <int>
#> 1     1     1     5
#> 2     1     1     6
#> 3     1     2     5
#> 4     1     2     6
#> 5     2     3     7
#> 6     2     3     8
#> 7     2     4     7
#> 8     2     4     8
源代码:R/unnest-longer.R

相关用法


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