如何使用保留空白的向量对多路数组进行子索引

时间:2018-10-04 07:47:47

标签: r

作为一个最小的示例,让我们考虑以下多路数组(a):

a = as.table(array(c(1:8), dim=c(2,2,2)))

对于此数组,手动子指示很容易,例如

a[1,,](符合维度1的2 x 2矩阵处于状态1(A))

我的问题是现在;我如何用保留空白的向量做同样的事情,例如类似于c(1,,)

请注意,我需要根据实例中观察到的变量来定义哪些尺寸(动态地)保留为空白;我最初的想法是通用。向量b = c(“”,“”,“”),如果在状态1中观察到变量1,则可以将其替换为1。 b [1] =“ 1”,但是,首先,我不知道如何使用此向量表示a [“ b”],或者是否有更好的方法来实现此目的。

我需要这种动态指示,因为我想在收到证据(信息==计数)时更新表的各个部分

非常感谢您!

最好, 塞巴斯蒂安

2 个答案:

答案 0 :(得分:0)

这是解决问题的肮脏方法:

数据:

a = as.table(array(c(1:8), dim=c(2,2,2)))

您的动态索引应为文本:(这是一个新的问题,如何将条件转化为indexindex2这样的字符串)

index  = "1,,"
index2 = ",2,"

功能:

crazyIndexing <- function(obj, index) {
    stringExpr = paste0(obj, "[",index,"]")
    return(eval(parse(text=stringExpr)))
}

调用您的函数:(看看它是怎么做的!)

a[1,,]
crazyIndexing("a",index)

a[,2,]
crazyIndexing("a",index2)

请注意:

b=c("","",""); b[1]="1"
index = paste0(b, collapse = ",")
#[1] "1,,"

您当然可以相应地更改功能:

crazyIndexing2 <- function(obj, obj2, index) {
    stringExpr = paste0(obj ,"[",index,"]", "<-", obj, "[",index,"]", "+", obj2)
    eval(parse(text=stringExpr))
    return( get(obj) )
}

a = as.table(array(c(1:8), dim=c(2,2,2)))

aa = a[,2,]

aopt = crazyIndexing2("a","aa","1,,")

现在您拥有了所有工具。

答案 1 :(得分:0)

这是我要怎么做:

while (evidence) {
    idx <- lapply(dim(a), function (dimsize) 1:dimsize)
    ## update `idx` according to `evidence`, e.g.,
    ## if you want to do `a[1,,2]`
    idx[[1]] <- 1
    idx[[3]] <- 2
    do.call(`[`, c(list(a), idx))
    ## if you want to do `a[1,,2] <- c(20, 30)`
    a <- do.call(`[<-`, c(list(a), idx, list(value=c(20, 30))))
}