Expand.grid(a,b,c) 生成矩阵中 a、b 和 c 中的值的所有组合 - 本质上填充三维立方体的体积。我想要的是一种从以立方体为中心的立方体(或更高维结构)中获取切片或线的方法。
因此,假设 a、b、c 都是奇数长度向量(因此它们有一个中心),在这种情况下,假设它们的长度为 5。我假设的 slice.grid 函数:
slice.grid(a,b,c,dimension=1)
Run Code Online (Sandbox Code Playgroud)
返回沿三个中心线的点的坐标矩阵。几乎相当于:
rbind(expand.grid(a[3],b,c[3]),
expand.grid(a,b[3],c[3]),
expand.grid(a[3],b[3],c))
Run Code Online (Sandbox Code Playgroud)
几乎,因为它的中心点重复了三次。此外:
slice.grid(a,b,c,dimension=2)
Run Code Online (Sandbox Code Playgroud)
应返回一个等价于的矩阵:
rbind(expand.grid(a,b,c[3]), expand.grid(a,b[3],c), expand.grid(a[3],b,c))
Run Code Online (Sandbox Code Playgroud)
这是三个相交的轴对齐平面(矩阵中的交叉点有重复的点)。
进而:
slice.grid(a,b,c,dimension=3)
Run Code Online (Sandbox Code Playgroud)
与 Expand.grid(a,b,c) 相同。
对于三个参数来说这还不错,但理想情况下我想用传递给函数 Expand.grid(a,b,c,d,e,f,dimension=4) 的 N 个参数来做到这一点 - 这不太可能但我希望维度大于 3。
可以通过执行 Expand.grid 然后提取所需的点来完成,但我不确定如何构建该标准。而且我总有一种感觉,这个函数存在于某个包中的某个地方......
[编辑] 是的,我想我现在已经弄清楚了标准 - 它与中心值在每行中出现的次数有关。如果它小于或等于你的维度+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)
Run Code Online (Sandbox Code Playgroud)