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


R dplyr nest_by 由一个或多个变量嵌套


[Experimental]

nest_by()group_by() 密切相关。然而,组结构不是存储在元数据中,而是在数据中明确显示,为每个组键提供一行以及包含所有其他数据的数据帧列表列。

nest_by()返回一个rowwise数据帧,这使得对分组数据的操作特别优雅。有关更多详细信息,请参阅vignette("rowwise")

用法

nest_by(.data, ..., .key = "data", .keep = FALSE)

参数

.data

数据帧、数据帧扩展(例如 tibble)或惰性数据帧(例如来自 dbplyr 或 dtplyr)。有关更多详细信息,请参阅下面的方法。

...

group_by() 中,用于分组的变量或计算。计算始终在未分组的数据帧上完成。要对分组数据执行计算,您需要在 group_by() 之前使用单独的 mutate() 步骤。 nest_by() 中不允许进行计算。在 ungroup() 中,要从分组中删除的变量。

.key

列表列的名称

.keep

分组列是否应该保留在列表列中。

rowwise 数据帧。输出具有以下属性:

  • 这些行来自底层 group_keys()

  • 这些列是分组键加上一列 DataFrame 。

  • DataFrame 属性不会保留,因为 nest_by() 从根本上创建了一个新的 DataFrame 。

一个表,每个分组变量的唯一组合包含一行。第一列是分组变量,后面是一个 tibbles 列表列,以及其余列的匹配行。

细节

请注意,df %>% nest_by(x, y) 大致相当于

df %>%
  group_by(x, y) %>%
  summarise(data = list(pick(everything()))) %>%
  rowwise()

如果要取消嵌套嵌套 DataFrame ,可以使用 tidyr::unnest() 或利用 reframe() s multi-row 行为:

nested %>%
  reframe(data)

生命周期

nest_by() 不稳定,因为 tidyr::nest(.by =) 提供非常相似的行为。它将来可能会被弃用。

方法

该函数是泛型函数,这意味着包可以为其他类提供实现(方法)。有关额外参数和行为差异,请参阅各个方法的文档。

当前在加载的包中可以使用以下方法: dplyr ( data.frame , grouped_df ) 。

例子

# After nesting, you get one row per group
iris %>% nest_by(Species)
#> # A tibble: 3 × 2
#> # Rowwise:  Species
#>   Species                  data
#>   <fct>      <list<tibble[,4]>>
#> 1 setosa               [50 × 4]
#> 2 versicolor           [50 × 4]
#> 3 virginica            [50 × 4]
starwars %>% nest_by(species)
#> # A tibble: 38 × 2
#> # Rowwise:  species
#>    species                  data
#>    <chr>     <list<tibble[,13]>>
#>  1 Aleena               [1 × 13]
#>  2 Besalisk             [1 × 13]
#>  3 Cerean               [1 × 13]
#>  4 Chagrian             [1 × 13]
#>  5 Clawdite             [1 × 13]
#>  6 Droid                [6 × 13]
#>  7 Dug                  [1 × 13]
#>  8 Ewok                 [1 × 13]
#>  9 Geonosian            [1 × 13]
#> 10 Gungan               [3 × 13]
#> # ℹ 28 more rows

# The output is grouped by row, which makes modelling particularly easy
models <- mtcars %>%
  nest_by(cyl) %>%
  mutate(model = list(lm(mpg ~ wt, data = data)))
models
#> # A tibble: 3 × 3
#> # Rowwise:  cyl
#>     cyl                data model 
#>   <dbl> <list<tibble[,10]>> <list>
#> 1     4           [11 × 10] <lm>  
#> 2     6            [7 × 10] <lm>  
#> 3     8           [14 × 10] <lm>  

models %>% summarise(rsq = summary(model)$r.squared)
#> `summarise()` has grouped output by 'cyl'. You can override using the
#> `.groups` argument.
#> # A tibble: 3 × 2
#> # Groups:   cyl [3]
#>     cyl   rsq
#>   <dbl> <dbl>
#> 1     4 0.509
#> 2     6 0.465
#> 3     8 0.423

# This is particularly elegant with the broom functions
models %>% summarise(broom::glance(model))
#> `summarise()` has grouped output by 'cyl'. You can override using the
#> `.groups` argument.
#> # A tibble: 3 × 13
#> # Groups:   cyl [3]
#>     cyl r.squared adj.r.squared sigma statistic p.value    df logLik   AIC
#>   <dbl>     <dbl>         <dbl> <dbl>     <dbl>   <dbl> <dbl>  <dbl> <dbl>
#> 1     4     0.509         0.454  3.33      9.32  0.0137     1 -27.7   61.5
#> 2     6     0.465         0.357  1.17      4.34  0.0918     1  -9.83  25.7
#> 3     8     0.423         0.375  2.02      8.80  0.0118     1 -28.7   63.3
#> # ℹ 4 more variables: BIC <dbl>, deviance <dbl>, df.residual <int>,
#> #   nobs <int>
models %>% reframe(broom::tidy(model))
#> # A tibble: 6 × 6
#>     cyl term        estimate std.error statistic    p.value
#>   <dbl> <chr>          <dbl>     <dbl>     <dbl>      <dbl>
#> 1     4 (Intercept)    39.6      4.35       9.10 0.00000777
#> 2     4 wt             -5.65     1.85      -3.05 0.0137    
#> 3     6 (Intercept)    28.4      4.18       6.79 0.00105   
#> 4     6 wt             -2.78     1.33      -2.08 0.0918    
#> 5     8 (Intercept)    23.9      3.01       7.94 0.00000405
#> 6     8 wt             -2.19     0.739     -2.97 0.0118    

# Note that you can also `reframe()` to unnest the data
models %>% reframe(data)
#> # A tibble: 32 × 11
#>      cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1     4  22.8 108      93  3.85  2.32  18.6     1     1     4     1
#>  2     4  24.4 147.     62  3.69  3.19  20       1     0     4     2
#>  3     4  22.8 141.     95  3.92  3.15  22.9     1     0     4     2
#>  4     4  32.4  78.7    66  4.08  2.2   19.5     1     1     4     1
#>  5     4  30.4  75.7    52  4.93  1.62  18.5     1     1     4     2
#>  6     4  33.9  71.1    65  4.22  1.84  19.9     1     1     4     1
#>  7     4  21.5 120.     97  3.7   2.46  20.0     1     0     3     1
#>  8     4  27.3  79      66  4.08  1.94  18.9     1     1     4     1
#>  9     4  26   120.     91  4.43  2.14  16.7     0     1     5     2
#> 10     4  30.4  95.1   113  3.77  1.51  16.9     1     1     5     2
#> # ℹ 22 more rows
源代码:R/nest-by.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Nest by one or more variables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。