在R中,当您不知道有多少维度时,如何仅为数组的最后一个维度编制索引?

时间:2017-05-21 16:50:47

标签: r

我有一个数组x,我事先并不知道它的尺寸。如何仅索引最后一个维度?例如:

trimGibbsChain <- function (x, ntrim) {
    toTrim <- -(1:ntrim)
    return(x[,,,toTrim]) # How many commas?
}

问题是,当你不知道数组的维度时,你不知道要放多少个逗号。最快的方法是什么?

1 个答案:

答案 0 :(得分:1)

基于alexis_laz评论中链接的解决方案

这可以通过使用列表作为索引使用[进行子集来完成:

lastInd <- function(x, n){
    nd <- length(dim(x))
    # uncomment the following line if x could be a plain vector without dim
    # if(nd == 0) nd = 1
    inds <- rep(alist(,)[1], nd)
    inds[nd] <- n
    do.call(`[`, c(list(x), inds))
}

原始答案

无法找到一个现有功能,但以下内容应该有效: x是一个至少为2-dim的数组; n是最后一个暗淡的索引;

lastInd <- function(x, n){
    d <- dim(x)
    d.new <- d[-length(d)]
    block.size <- prod(d.new)
    res <- x[(block.size * (n - 1) + 1):(block.size * n)]
    array(res, dim = d.new)
}

处理x是普通向量时的情况:

lastInd <- function(x, n){
    d <- dim(x)
    if(is.null(d)){
        x[n]
    }else{
        d.new <- d[-length(d)]
        block.size <- prod(d.new)
        res <- x[(block.size * (n - 1) + 1):(block.size * n)]
        array(res, dim = d.new)
    }
}

一个例子:

x <- array(1:12, dim = c(2, 2, 3))
lastInd(x, 2)

#      [,1] [,2]
# [1,]    5    7
# [2,]    6    8

lastInd(2:4, 3)
# [1] 4