如何从 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 生成满足特定条件的输出的主要内容,如果未能解决你的问题,请参考以下文章