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


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。