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


R tidyr nest 將行嵌套到 DataFrame 的列表列中


嵌套創建 DataFrame 的列表列;取消嵌套將其展平回常規列。嵌套隱式是一種匯總操作:對於由非嵌套列定義的每個組,您都會獲得一行。這與處理整個數據集(尤其是模型)的其他摘要結合使用非常有用。

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

用法

nest(.data, ..., .by = NULL, .key = NULL, .names_sep = NULL)

參數

.data

一個 DataFrame 。

...

<tidy-select> 要嵌套的列;這些將出現在內部 DataFrame 中。

使用 new_col = c(col1, col2, col3) 形式的 name-variable 對指定。右側可以是任何有效的 tidyselect 表達式。

如果未提供,則將 ... 派生為 .by 未選擇的所有列,並將使用 .key 中的列名稱。

[Deprecated]: 以前你可以寫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 在嵌套和取消嵌套之間大致對稱。

細節

如果 ....by 均未提供,則 nest() 將嵌套所有變量,並將使用通過 .key 提供的列名。

新語法

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/nest.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Nest rows into a list-column of data frames。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。