nest_by()
与group_by()
密切相关。然而,组结构不是存储在元数据中,而是在数据中明确显示,为每个组键提供一行以及包含所有其他数据的数据帧列表列。
nest_by()
返回一个rowwise数据帧,这使得对分组数据的操作特别优雅。有关更多详细信息,请参阅vignette("rowwise")
。
参数
- .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 dplyr nest_join 嵌套连接
- R dplyr near 比较两个数值向量
- R dplyr nth 从向量中提取第一个、最后一个或第 n 个值
- R dplyr n_distinct 计算独特的组合
- R dplyr na_if 将值转换为 NA
- R dplyr ntile 将数值向量分为 n 组
- R dplyr group_trim 修剪分组结构
- R dplyr slice 使用行的位置对行进行子集化
- R dplyr copy_to 将本地数据帧复制到远程src
- R dplyr sample_n 从表中采样 n 行
- R dplyr consecutive_id 为连续组合生成唯一标识符
- R dplyr row_number 整数排名函数
- R dplyr band_members 乐队成员
- R dplyr mutate-joins 变异连接
- R dplyr coalesce 找到第一个非缺失元素
- R dplyr group_split 按组分割 DataFrame
- R dplyr mutate 创建、修改和删除列
- R dplyr order_by 用于排序窗口函数输出的辅助函数
- R dplyr context 有关“当前”组或变量的信息
- R dplyr percent_rank 比例排名函数
- R dplyr recode 重新编码值
- R dplyr starwars 星球大战人物
- R dplyr desc 降序
- R dplyr between 检测值落在指定范围内的位置
- R dplyr cumall 任何、全部和平均值的累积版本
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Nest by one or more variables。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。