一个更通用的expand.grid函数?

时间:2011-02-02 16:51:32

标签: r

expand.grid(a,b,c)生成矩阵中a,b和c中值的所有组合 - 基本上填充三维立方体的体积。我想要的是一种从立方体(或更高维度结构)中取出切片或线条的方法。

所以,假设a,b,c都是奇数长度的向量(所以它们有一个中心),在这种情况下,假设它们的长度为5.我假设的slice.grid函数:

slice.grid(a,b,c,dimension=1)

返回沿三条中心线的点坐标矩阵。几乎相当于:

rbind(expand.grid(a[3],b,c[3]),
      expand.grid(a,b[3],c[3]),
      expand.grid(a[3],b[3],c))
几乎是因为它的中心点重复了三次。此外:

slice.grid(a,b,c,dimension=2)

应返回相当于的矩阵:

rbind(expand.grid(a,b,c[3]), expand.grid(a,b[3],c), expand.grid(a[3],b,c))

这是三个相交的轴对齐平面(在交叉点的矩阵中有重复的点)。

然后:

slice.grid(a,b,c,dimension=3)

与expand.grid(a,b,c)相同。

对于三个参数来说这并不是那么糟糕,但理想情况下我想通过传递给函数expand.grid(a,b,c,d,e,f,dimension = 4)的N个参数来做到这一点 - 我不太可能希望尺寸大于3。

可以通过执行expand.grid然后提取所需的那些点来完成,但我不确定如何构建该标准。而且我总觉得这个功能存在于某个地方的某个包里......

[编辑]对,我认为我现在已经找到了标准 - 它与中心值出现在每一行中的次数有关。如果它小于或等于你的尺寸+ 1 ...

但是生成完整矩阵会很快变大。它现在会做。

1 个答案:

答案 0 :(得分:1)

假设abc各自的长度为3(如果有4个变量,那么它们各自的长度为4,依此类推)试试这个。它的工作原理是使用1:3代替abc中的每一个,然后计算每行中有多少3个。如果有四个变量,那么它使用1:4并计算每行中有多少4个等。它使用此索引从expand.grid(a, b, c)中选择适当的行:

slice.expand <- function(..., dimension = 1) {
    L <- lapply(list(...), seq_along)
        n <- length(L)
    ix <- rowSums(do.call(expand.grid, L) == n) >= (n-dimension)
    expand.grid(...)[ix, ]
}

# test
a <- b <- c <- LETTERS[1:3]
slice.expand(a, b, c, dimension = 1)
slice.expand(a, b, c, dimension = 2)
slice.expand(a, b, c, dimension = 3)