嵌套創建 DataFrame 的列表列;取消嵌套將其展平回常規列。嵌套隱式是一種匯總操作:對於由非嵌套列定義的每個組,您都會獲得一行。這與處理整個數據集(尤其是模型)的其他摘要結合使用非常有用。
在vignette("nest")
中了解更多信息。
參數
- .data
-
一個 DataFrame 。
- ...
-
<
tidy-select
> 要嵌套的列;這些將出現在內部 DataFrame 中。使用
new_col = c(col1, col2, col3)
形式的 name-variable 對指定。右側可以是任何有效的 tidyselect 表達式。如果未提供,則將
...
派生為.by
未選擇的所有列,並將使用.key
中的列名稱。: 以前你可以寫
df %>% nest(x, y, z)
。轉換成df %>% nest(data = c(x, y, z))
. - .by
-
<
tidy-select
> 嵌套的列;這些將保留在外部 DataFrame 中。.by
可以代替...
提供的列使用或與...
提供的列結合使用。如果未提供,則將
.by
派生為...
未選擇的所有列。 - .key
-
生成的嵌套列的名稱。僅適用於未指定
...
的情況,即df %>% nest(.by = x)
的情況。如果
NULL
,則默認使用"data"
。 - .names_sep
-
如果默認為
NULL
,則內部名稱將來自以前的外部名稱。如果是字符串,新的內部名稱將使用外部名稱,並自動刪除names_sep
。這使得names_sep
在嵌套和取消嵌套之間大致對稱。
新語法
tidyr 1.0.0 為 nest()
和 unnest()
引入了新語法,其設計與其他函數更加相似。轉換為新語法應該很簡單(由您將收到的消息引導),但如果您隻需要運行舊分析,則可以使用 nest_legacy()
和 unnest_legacy()
輕鬆恢複到以前的行為,如下所示:
library(tidyr)
nest <- nest_legacy
unnest <- unnest_legacy
分組 DataFrame
df %>% nest(data = c(x, y))
指定要嵌套的列;即將出現在內部 DataFrame 中的列。 df %>% nest(.by = c(x, y))
指定嵌套的列;即將保留在外部 DataFrame 中的列。實現後者的另一種方法是 nest()
由 dplyr::group_by()
創建的分組數據幀。分組變量保留在外部 DataFrame 中,其他變量則嵌套。結果保留輸入的分組。
提供給 nest()
的變量將覆蓋分組變量,以便 df %>% group_by(x, y) %>% nest(data = !z)
將相當於 df %>% nest(data = !z)
。
您無法為 .by
提供分組 DataFrame ,因為這些組已經代表您嵌套的內容。
例子
df <- tibble(x = c(1, 1, 1, 2, 2, 3), y = 1:6, z = 6:1)
# Specify variables to nest using name-variable pairs.
# Note that we get one row of output for each unique combination of
# non-nested variables.
df %>% nest(data = c(y, z))
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 2]>
#> 2 2 <tibble [2 × 2]>
#> 3 3 <tibble [1 × 2]>
# Specify variables to nest by (rather than variables to nest) using `.by`
df %>% nest(.by = x)
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 2]>
#> 2 2 <tibble [2 × 2]>
#> 3 3 <tibble [1 × 2]>
# In this case, since `...` isn't used you can specify the resulting column
# name with `.key`
df %>% nest(.by = x, .key = "cols")
#> # A tibble: 3 × 2
#> x cols
#> <dbl> <list>
#> 1 1 <tibble [3 × 2]>
#> 2 2 <tibble [2 × 2]>
#> 3 3 <tibble [1 × 2]>
# Use tidyselect syntax and helpers, just like in `dplyr::select()`
df %>% nest(data = any_of(c("y", "z")))
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 2]>
#> 2 2 <tibble [2 × 2]>
#> 3 3 <tibble [1 × 2]>
# `...` and `.by` can be used together to drop columns you no longer need,
# or to include the columns you are nesting by in the inner data frame too.
# This drops `z`:
df %>% nest(data = y, .by = x)
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 1]>
#> 2 2 <tibble [2 × 1]>
#> 3 3 <tibble [1 × 1]>
# This includes `x` in the inner data frame:
df %>% nest(data = everything(), .by = x)
#> # A tibble: 3 × 2
#> x data
#> <dbl> <list>
#> 1 1 <tibble [3 × 3]>
#> 2 2 <tibble [2 × 3]>
#> 3 3 <tibble [1 × 3]>
# Multiple nesting structures can be specified at once
iris %>%
nest(petal = starts_with("Petal"), sepal = starts_with("Sepal"))
#> # A tibble: 3 × 3
#> Species petal sepal
#> <fct> <list> <list>
#> 1 setosa <tibble [50 × 2]> <tibble [50 × 2]>
#> 2 versicolor <tibble [50 × 2]> <tibble [50 × 2]>
#> 3 virginica <tibble [50 × 2]> <tibble [50 × 2]>
iris %>%
nest(width = contains("Width"), length = contains("Length"))
#> # A tibble: 3 × 3
#> Species width length
#> <fct> <list> <list>
#> 1 setosa <tibble [50 × 2]> <tibble [50 × 2]>
#> 2 versicolor <tibble [50 × 2]> <tibble [50 × 2]>
#> 3 virginica <tibble [50 × 2]> <tibble [50 × 2]>
# Nesting a grouped data frame nests all variables apart from the group vars
fish_encounters %>%
dplyr::group_by(fish) %>%
nest()
#> # A tibble: 19 × 2
#> # Groups: fish [19]
#> fish data
#> <fct> <list>
#> 1 4842 <tibble [11 × 2]>
#> 2 4843 <tibble [11 × 2]>
#> 3 4844 <tibble [11 × 2]>
#> 4 4845 <tibble [5 × 2]>
#> 5 4847 <tibble [3 × 2]>
#> 6 4848 <tibble [4 × 2]>
#> 7 4849 <tibble [2 × 2]>
#> 8 4850 <tibble [6 × 2]>
#> 9 4851 <tibble [2 × 2]>
#> 10 4854 <tibble [2 × 2]>
#> 11 4855 <tibble [5 × 2]>
#> 12 4857 <tibble [9 × 2]>
#> 13 4858 <tibble [11 × 2]>
#> 14 4859 <tibble [5 × 2]>
#> 15 4861 <tibble [11 × 2]>
#> 16 4862 <tibble [9 × 2]>
#> 17 4863 <tibble [2 × 2]>
#> 18 4864 <tibble [2 × 2]>
#> 19 4865 <tibble [3 × 2]>
# That is similar to `nest(.by = )`, except here the result isn't grouped
fish_encounters %>%
nest(.by = fish)
#> # A tibble: 19 × 2
#> fish data
#> <fct> <list>
#> 1 4842 <tibble [11 × 2]>
#> 2 4843 <tibble [11 × 2]>
#> 3 4844 <tibble [11 × 2]>
#> 4 4845 <tibble [5 × 2]>
#> 5 4847 <tibble [3 × 2]>
#> 6 4848 <tibble [4 × 2]>
#> 7 4849 <tibble [2 × 2]>
#> 8 4850 <tibble [6 × 2]>
#> 9 4851 <tibble [2 × 2]>
#> 10 4854 <tibble [2 × 2]>
#> 11 4855 <tibble [5 × 2]>
#> 12 4857 <tibble [9 × 2]>
#> 13 4858 <tibble [11 × 2]>
#> 14 4859 <tibble [5 × 2]>
#> 15 4861 <tibble [11 × 2]>
#> 16 4862 <tibble [9 × 2]>
#> 17 4863 <tibble [2 × 2]>
#> 18 4864 <tibble [2 × 2]>
#> 19 4865 <tibble [3 × 2]>
# Nesting is often useful for creating per group models
mtcars %>%
nest(.by = cyl) %>%
dplyr::mutate(models = lapply(data, function(df) lm(mpg ~ wt, data = df)))
#> # A tibble: 3 × 3
#> cyl data models
#> <dbl> <list> <list>
#> 1 6 <tibble [7 × 10]> <lm>
#> 2 4 <tibble [11 × 10]> <lm>
#> 3 8 <tibble [14 × 10]> <lm>
相關用法
- R tidyr nest_legacy Nest() 和 unnest() 的舊版本
- R tidyr separate_rows 將折疊的列分成多行
- R tidyr extract 使用正則表達式組將字符列提取為多列
- R tidyr chop 砍伐和砍伐
- R tidyr pivot_longer_spec 使用規範將數據從寬轉為長
- R tidyr unnest_longer 將列表列取消嵌套到行中
- R tidyr uncount “計數” DataFrame
- R tidyr cms_patient_experience 來自醫療保險和醫療補助服務中心的數據
- R tidyr pivot_wider_spec 使用規範將數據從長軸轉向寬軸
- R tidyr replace_na 將 NA 替換為指定值
- R tidyr unnest_wider 將列表列取消嵌套到列中
- R tidyr full_seq 在向量中創建完整的值序列
- R tidyr separate 使用正則表達式或數字位置將字符列分成多列
- R tidyr pivot_wider 將數據從長軸轉向寬軸
- 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 舊名稱修複
- R tidyr complete 完成缺少數據組合的 DataFrame
- R tidyr expand 擴展 DataFrame 以包含所有可能的值組合
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Nest rows into a list-column of data frames。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。