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

如何使用expand.grid获取R数据框的目标唯一行集合?

如何用expand.grid生成指定的唯一组合数据框

原始数据框

首先创建目标数据框:

df <- data.frame(x=rep(c("A","B","C"),each=4),z=rep(c(1,2),each=2,times=3), c1=rep(c("u","w","v"),each=4))

数据框内容:

x z c1
1  A 1  u
2  A 1  u
3  A 2  u
4  A 2  u
5  B 1  w
6  B 1  w
7  B 2  w
8  B 2  w
9  C 1  v
10 C 1  v
11 C 2  v
12 C 2  v

目标结果

需要生成的唯一组合数据框:

x z c1
1 A 1 u
2 B 1 w
3 C 1 v
4 A 2 u
5 B 2 w
6 C 2 v

问题描述

直接对每个变量的唯一值调用expand.grid会生成全笛卡尔积,不符合需求:

with(df, expand.grid(x=unique(x),z=unique(z),c1=unique(c1)))

得到的错误结果:

x z c1
1  A 1  u
2  B 1  u
3  C 1  u
4  A 2  u
5  B 2  u
6  C 2  u
7  A 1  w
8  B 1  w
9  C 1  w
10 A 2  w
11 B 2  w
12 C 2  w
13 A 1  v
14 B 1  v
15 C 1  v
16 A 2  v
17 B 2  v
18 C 2  v

解决方案

核心是先保留x和c1的固定配对关系,再和z的唯一值做组合:

分步实现

# 提取x和c1的唯一配对组合
x_c1 <- unique(df[, c("x", "c1")])
# 用x_c1和z的唯一值生成目标组合
result <- expand.grid(x_c1, z = unique(df$z))
# 调整列顺序匹配目标结果
result <- result[, c("x", "z", "c1")]

一行代码简化

with(df, expand.grid(unique(data.frame(x, c1)), z = unique(z)))[, c("x", "z", "c1")]

运行后即可得到目标结果:

x z c1
1 A 1 u
2 B 1 w
3 C 1 v
4 A 2 u
5 B 2 w
6 C 2 v

内容的提问来源于stack exchange,提问作者HappyPy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:27:30