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 ...
但是生成完整矩阵会很快变大。它现在会做。
答案 0 :(得分:1)
假设a
,b
和c
各自的长度为3(如果有4个变量,那么它们各自的长度为4,依此类推)试试这个。它的工作原理是使用1:3代替a
,b
和c
中的每一个,然后计算每行中有多少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)