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