如何从 R 中的 expand.grid 生成满足特定条件的输出

Posted

技术标签:

【中文标题】如何从 R 中的 expand.grid 生成满足特定条件的输出【英文标题】:How to generate an output satisfied with specific conditions from expand.grid in R 【发布时间】:2012-02-17 18:22:53 【问题描述】:

我正在运行expand.grid 函数。举个简单的例子,

a <- c(1,2,3,"X","Y","M") 
b is identical as b.

如果我选择expand.grid(a,b),它会返回所有对,包括对角线元素 -- (1,1),(2,2),....(y,y),以及第一个元素对大于第二个 --(2,1),(3,2)(x,1),...等。 (但实际上,这里不是数字比较,因为有一些字符,如 x,y)我想在输出中排除这些对。如何使用 expand.grid 函数或任何其他函数来简单地生成没有它们的输出?

【问题讨论】:

【参考方案1】:
 eg <- expand.grid(a=1:4, b=1:4)

> eg[eg$a < eg$b, ]
   a b
5  1 2
9  1 3
10 2 3
13 1 4
14 2 4
15 3 4

这里是另一个可能有用的函数combn,它返回一个需要转置的矩阵才能得到你想要的:

> data.frame(t(combn(x=1:4, m=2)))
  X1 X2
1  1  2
2  1  3
3  1  4
4  2  3
5  2  4
6  3  4

【讨论】:

【参考方案2】:

对 Vincent Zoonekynd 的轻微修改将处理非数字因素:

a <- c(1,2,3,"X","Y","M")
eg <- expand.grid(a,a)
eg2 <- eg[as.character(eg$Var1) < as.character(eg$Var2), ]

基本上,您需要使用字符串比较,而不是对因子变量不起作用的“普通”比较。

【讨论】:

【参考方案3】:

你可以只取你感兴趣的子集:

a <- b <- 1:5
subset( expand.grid(a,b), Var1 < Var2 )

【讨论】:

对不起,我刚刚编辑了我的问题,在 a,b 中有一些字符,例如

以上是关于如何从 R 中的 expand.grid 生成满足特定条件的输出的主要内容,如果未能解决你的问题,请参考以下文章

r expand.grid

expand.grid 的动态参数

如何从 R 中的 rasterbrick 对象创建长格式数据框

expand.grid 的非冗余版本

R:如何从该列表中的所有数据框中删除行?

了解 Plotly 中的 3D 轨迹