如何使用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
相关产品推荐
相关产品推荐

