當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。