如何使用tidyr::crossing函数?它和expand.grid有何区别
tidyr::crossing 函数说明 结果存在差异的原因
你测试时的参数传递方式不符合crossing的设计逻辑:
- 基础R的
expand.grid()支持直接传入一个列表,会自动把列表的每个元素作为独立的向量生成笛卡尔积 tidyr::crossing()(以及它依赖的expand_grid())默认会把传入的单个列表识别为单个列的元素,所以才会得到1行1列的结果。
正确的对比写法
如果要得到和你测试的expand.grid完全一致的输出,可以用两种写法:
# 写法1:逐个传入要交叉的向量 tidyr::crossing(Var1 = 1:4, Var2 = 1:4) # 写法2:用!!!操作符展开列表参数 tidyr::crossing(!!!list(1:4, 1:4))
运行后会得到16行2列的tibble,和expand.grid的返回值结构对应,只是格式为tidyverse标准的tibble。
crossing的核心作用
官方文档的描述是准确的:它是expand_grid的封装,会先对所有输入向量做去重、排序,再生成笛卡尔积,核心特性包括:
- 返回结果为tibble格式,默认不会将字符串转换为因子,符合tidyverse的使用习惯
- 自动对每个输入向量先去重,再按升序排列,再生成所有组合,避免生成多余的重复行
- 生成的结果会按输入列的顺序优先排序,和
expand.grid的排序逻辑一致
特性演示示例
# 输入有重复、乱序的向量 x <- c(3,1,2,1) y <- c("b","a","b") # expand.grid保留所有重复、原顺序,返回12行结果 expand.grid(x = x, y = y) # crossing先对x、y去重排序,返回6行有序的无重复组合 tidyr::crossing(x = x, y = y)
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

