You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:45:02