expand()
生成数据集中找到的所有变量组合。它与 nesting()
和 crossing()
帮助程序配对。 crossing()
是 expand_grid()
和 de-duplicates 的包装器,并对其输入进行排序; nesting()
是一个助手,仅查找数据中已存在的组合。
expand()
通常与连接结合使用:
-
将其与
right_join()
一起使用,将隐式缺失值转换为显式缺失值(例如,填充 DataFrame 中的空白)。 -
将其与
anti_join()
一起使用来找出缺少哪些组合(例如,识别 DataFrame 中的间隙)。
用法
expand(data, ..., .name_repair = "check_unique")
crossing(..., .name_repair = "check_unique")
nesting(..., .name_repair = "check_unique")
参数
- data
-
一个 DataFrame 。
- ...
-
<
data-masking
> 要扩展或完成的列规范。列可以是原子向量或列表。-
要查找
x
、y
和z
的所有唯一组合(包括数据中不存在的组合),请将每个变量作为单独的参数提供:expand(df, x, y, z)
或complete(df, x, y, z)
。 -
要仅查找数据中出现的组合,请使用
nesting
:expand(df, nesting(x, y, z))
。 -
您可以将这两种形式结合起来。例如,
expand(df, nesting(school_id, student_id), date)
将为所有可能日期的每个当前 school-student 组合生成一行。
与因子一起使用时,
expand()
和complete()
使用完整的级别集,而不仅仅是数据中出现的级别。如果您只想使用数据中看到的值,请使用forcats::fct_drop()
。与连续变量一起使用时,您可能需要填充数据中未出现的值:为此,请使用
year = 2010:2020
或year = full_seq(year,1)
等表达式。 -
- .name_repair
-
有问题的列名的处理:
-
"minimal"
:没有名称修复或检查,超出基本存在, -
"unique"
:确保名称唯一且不为空, -
"check_unique"
:(默认值),没有名称修复,但检查它们是unique
, -
"universal"
:命名为unique
和语法 -
函数:应用自定义名称修复(例如,
.name_repair = make.names
用于基本 R 样式的名称)。 -
purrr-style 匿名函数,请参阅
rlang::as_function()
此参数作为
repair
传递到vctrs::vec_as_names()
。有关这些条款以及用于执行这些条款的策略的更多详细信息,请参阅此处。 -
分组 DataFrame
通过 dplyr::group_by()
创建的分组数据帧,expand()
在每个组内运行。因此,您无法扩展分组列。
也可以看看
complete()
展开列表对象。 expand_grid()
输入向量而不是数据帧。
例子
# Finding combinations ------------------------------------------------------
fruits <- tibble(
type = c("apple", "orange", "apple", "orange", "orange", "orange"),
year = c(2010, 2010, 2012, 2010, 2011, 2012),
size = factor(
c("XS", "S", "M", "S", "S", "M"),
levels = c("XS", "S", "M", "L")
),
weights = rnorm(6, as.numeric(size) + 2)
)
# All combinations, including factor levels that are not used
fruits %>% expand(type)
#> # A tibble: 2 × 1
#> type
#> <chr>
#> 1 apple
#> 2 orange
fruits %>% expand(size)
#> # A tibble: 4 × 1
#> size
#> <fct>
#> 1 XS
#> 2 S
#> 3 M
#> 4 L
fruits %>% expand(type, size)
#> # A tibble: 8 × 2
#> type size
#> <chr> <fct>
#> 1 apple XS
#> 2 apple S
#> 3 apple M
#> 4 apple L
#> 5 orange XS
#> 6 orange S
#> 7 orange M
#> 8 orange L
fruits %>% expand(type, size, year)
#> # A tibble: 24 × 3
#> type size year
#> <chr> <fct> <dbl>
#> 1 apple XS 2010
#> 2 apple XS 2011
#> 3 apple XS 2012
#> 4 apple S 2010
#> 5 apple S 2011
#> 6 apple S 2012
#> 7 apple M 2010
#> 8 apple M 2011
#> 9 apple M 2012
#> 10 apple L 2010
#> # … with 14 more rows
# Only combinations that already appear in the data
fruits %>% expand(nesting(type))
#> # A tibble: 2 × 1
#> type
#> <chr>
#> 1 apple
#> 2 orange
fruits %>% expand(nesting(size))
#> # A tibble: 3 × 1
#> size
#> <fct>
#> 1 XS
#> 2 S
#> 3 M
fruits %>% expand(nesting(type, size))
#> # A tibble: 4 × 2
#> type size
#> <chr> <fct>
#> 1 apple XS
#> 2 apple M
#> 3 orange S
#> 4 orange M
fruits %>% expand(nesting(type, size, year))
#> # A tibble: 5 × 3
#> type size year
#> <chr> <fct> <dbl>
#> 1 apple XS 2010
#> 2 apple M 2012
#> 3 orange S 2010
#> 4 orange S 2011
#> 5 orange M 2012
# Other uses ----------------------------------------------------------------
# Use with `full_seq()` to fill in values of continuous variables
fruits %>% expand(type, size, full_seq(year, 1))
#> # A tibble: 24 × 3
#> type size `full_seq(year, 1)`
#> <chr> <fct> <dbl>
#> 1 apple XS 2010
#> 2 apple XS 2011
#> 3 apple XS 2012
#> 4 apple S 2010
#> 5 apple S 2011
#> 6 apple S 2012
#> 7 apple M 2010
#> 8 apple M 2011
#> 9 apple M 2012
#> 10 apple L 2010
#> # … with 14 more rows
fruits %>% expand(type, size, 2010:2013)
#> # A tibble: 32 × 3
#> type size `2010:2013`
#> <chr> <fct> <int>
#> 1 apple XS 2010
#> 2 apple XS 2011
#> 3 apple XS 2012
#> 4 apple XS 2013
#> 5 apple S 2010
#> 6 apple S 2011
#> 7 apple S 2012
#> 8 apple S 2013
#> 9 apple M 2010
#> 10 apple M 2011
#> # … with 22 more rows
# Use `anti_join()` to determine which observations are missing
all <- fruits %>% expand(type, size, year)
all
#> # A tibble: 24 × 3
#> type size year
#> <chr> <fct> <dbl>
#> 1 apple XS 2010
#> 2 apple XS 2011
#> 3 apple XS 2012
#> 4 apple S 2010
#> 5 apple S 2011
#> 6 apple S 2012
#> 7 apple M 2010
#> 8 apple M 2011
#> 9 apple M 2012
#> 10 apple L 2010
#> # … with 14 more rows
all %>% dplyr::anti_join(fruits)
#> Joining, by = c("type", "size", "year")
#> # A tibble: 19 × 3
#> type size year
#> <chr> <fct> <dbl>
#> 1 apple XS 2011
#> 2 apple XS 2012
#> 3 apple S 2010
#> 4 apple S 2011
#> 5 apple S 2012
#> 6 apple M 2010
#> 7 apple M 2011
#> 8 apple L 2010
#> 9 apple L 2011
#> 10 apple L 2012
#> 11 orange XS 2010
#> 12 orange XS 2011
#> 13 orange XS 2012
#> 14 orange S 2012
#> 15 orange M 2010
#> 16 orange M 2011
#> 17 orange L 2010
#> 18 orange L 2011
#> 19 orange L 2012
# Use with `right_join()` to fill in missing rows (like `complete()`)
fruits %>% dplyr::right_join(all)
#> Joining, by = c("type", "year", "size")
#> # A tibble: 25 × 4
#> type year size weights
#> <chr> <dbl> <fct> <dbl>
#> 1 apple 2010 XS 5.21
#> 2 orange 2010 S 2.88
#> 3 apple 2012 M 3.80
#> 4 orange 2010 S 4.47
#> 5 orange 2011 S 3.24
#> 6 orange 2012 M 3.55
#> 7 apple 2011 XS NA
#> 8 apple 2012 XS NA
#> 9 apple 2010 S NA
#> 10 apple 2011 S NA
#> # … with 15 more rows
# Use with `group_by()` to expand within each group
fruits %>%
dplyr::group_by(type) %>%
expand(year, size)
#> # A tibble: 20 × 3
#> # Groups: type [2]
#> type year size
#> <chr> <dbl> <fct>
#> 1 apple 2010 XS
#> 2 apple 2010 S
#> 3 apple 2010 M
#> 4 apple 2010 L
#> 5 apple 2012 XS
#> 6 apple 2012 S
#> 7 apple 2012 M
#> 8 apple 2012 L
#> 9 orange 2010 XS
#> 10 orange 2010 S
#> 11 orange 2010 M
#> 12 orange 2010 L
#> 13 orange 2011 XS
#> 14 orange 2011 S
#> 15 orange 2011 M
#> 16 orange 2011 L
#> 17 orange 2012 XS
#> 18 orange 2012 S
#> 19 orange 2012 M
#> 20 orange 2012 L
相关用法
- R tidyr expand_grid 从所有输入组合创建一个 tibble
- R tidyr extract 使用正则表达式组将字符列提取为多列
- R tidyr separate_rows 将折叠的列分成多行
- 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 nest 将行嵌套到 DataFrame 的列表列中
- R tidyr separate 使用正则表达式或数字位置将字符列分成多列
- R tidyr pivot_wider 将数据从长轴转向宽轴
- R tidyr nest_legacy Nest() 和 unnest() 的旧版本
- 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 旧名称修复
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Expand data frame to include all possible combinations of values。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。