R:如何删除元素从数组的最后一个维度,当维数未知先验?

jgwigjjp  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(112)

我想从数组的最后一个维度中删除一些元素-但先验我不知道数组的维度数,可能是2或更多。
假设要移除的元素在向量中(值不重要)

toremove <- c(2,5,6)

字符串
如果A是我的数组,并且我知道它是三维的,那么我可以这样做

Anew <- A[, , -toremove, drop=F]


(其中包含drop是为了在除了一个元素之外的所有元素都被删除的情况下保持维度),类似地,如果A有其他维度,只需使用适当数量的逗号,
但是如果我不知道A的维数呢?我希望找到一个简短、快速的解决方案,并且最好在中间步骤中不会导致A的许多副本。
(From我所看到的,不管是最后一个还是第一个,都不重要。)
我考虑的是:

  • 检查dim(A)并从中计算要从c(A)中删除的所有元素的 * 绝对 * 索引;然后重新调整维度。
  • 检查dim(A),并对每个可能的维度逐个进行,并使用一些if语句。
  • 可能使用do.call,如this answer中所建议的-但我还没有设法使用这个想法:我不知道如何给予空参数,...,do.call
nbewdwxp

nbewdwxp1#

有一种方法可以通过alist在构造的调用列表中设置空参数。如果我们这样做,例如:

alist(,)[1]
#> [[1]]

字符串
然后我们有一个空的list元素,我们可以将它传递给rep以获得多个空参数。这允许我们通过这个函数来构建我们想要的调用:

call_to_remove_last <- function(A, ind) {
  
  args <- c(quote(`[`),
            substitute(A), 
            rep(alist(,)[1], length(dim(A)) - 1), 
            substitute(ind), 
            drop = FALSE)
  
  as.call(args)
}


让我们在一个虚拟的3d和4d数组上测试一下:

arr_3d <- array(1:24, dim = c(2, 2, 6))
arr_4d <- array(1:120, dim = c(5, 2, 2, 6))
toremove <- c(2, 5, 6)

call_to_remove_last(arr_3d, toremove)
#> arr_3d[, , toremove, drop = FALSE]

call_to_remove_last(arr_4d, toremove)
#> arr_4d[, , , toremove, drop = FALSE]


我们实际需要的函数只是额外的步骤来计算这个调用:

remove_last <- function(A, ind) {
  
  args <- c(quote(`[`),
            substitute(A), 
            rep(alist(,)[1], length(dim(A)) - 1), 
            substitute(ind), 
            drop = FALSE)
  
  eval(as.call(args))
}
``
When we test, we see that the final dimension has dropped by length 3, as expected:
```r
dim(remove_last(arr_3d, toremove))
#> [1] 2 2 3

dim(remove_last(arr_4d, toremove))
#> [1] 5 2 2 3


创建于2023-07-19,使用reprex v2.0.2

ndasle7k

ndasle7k2#

如果我们在缺少逗号的地方使用TRUE,我的问题中的选项3似乎可以工作:

Anew <- do.call('[', c(list(A), rep(TRUE, length(dim(A))-1), list(-toremove), list(drop=FALSE))

字符串
我很高兴听到更好的解决方案。

相关问题