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