我有一个多维数组并尝试为特定维度分配值。请参阅下面的代码以了解我当前的方法。

# Create a array and fill with NA
set.seed(1)
dim_arr <- seq(2, 10)
arr <- array(NA, dim = dim_arr)

# Add values to the dimension 2 and fill other dimensions
add_dim <- 2

# Generate value
values <- runif(prod(dim_arr[-add_dim]))
# Assign value to position 1 of dimension 2
arr[,1,,,,,,,] <- values

values <- runif(prod(dim_arr[-add_dim]))
# Assign value to position 2 of dimension 2
arr[,2,,,,,,,] <- values

我的问题是维数 (dim_arr) 和更改的维数 (add_dim) 不是固定的。当参数 dim_arr 和 add_dim 更改时,代码“arr[,1,,,,,,,]”被破坏,我每次都必须更改它。

是否有任何通用方法可以改进我的代码?

如果我的问题不清楚,请告诉我。感谢您的任何建议。

最佳答案

正确的方法是调用 do.call 指定每个维度的完整范围,而不是你想要的维度(例如 do.call("[<-", list(arr, 1:x, 1:y, 3, values) )。有趣的方法是利用 mysterious missing object x[,,,z,,,] 中生成空参数。

编辑:最后包含了一种更无聊但更简单的方法,因为结果证明单个 TRUE 作为参数等效于缺少的参数。

EDIT2:使用 Hadley 的 substitute() 方法进行了简化。

replace_dim <- function(arr, rep.val, dim.to.rep, dim.val) {
  dim.list <- replicate(length(dim(arr)), substitute())
  dim.list[dim.to.rep] <- dim.val
  do.call(`[<-`, c(list(arr), dim.list, list(rep.val)))
}
arr <- array(1:8, dim=rep(2, 3))

replace_dim(arr, 555, 3, 1)  # note this doesn't modify `arr`, so you would have to set `arr` to the return value
# , , 1
#      [,1] [,2]
# [1,]  555  555
# [2,]  555  555
# , , 2
#      [,1] [,2]
# [1,]    5    7
# [2,]    6    8

replace_dim(arr, 555, 2, 1)
# , , 1
#      [,1] [,2]
# [1,]  555    3
# [2,]  555    4
# , , 2
#      [,1] [,2]
# [1,]  555    7
# [2,]  555    8

replace_dim(arr, 555, 1, 1)
# , , 1
#      [,1] [,2]
# [1,]  555  555
# [2,]    2    4
# , , 2
#      [,1] [,2]
# [1,]  555  555
# [2,]    6    8

replace_dim(arr, 555, 1, 2)
# , , 1
#      [,1] [,2]
# [1,]    1    3
# [2,]  555  555
# , , 2
#      [,1] [,2]
# [1,]    5    7
# [2,]  555  555

此外,这里我们使用了 555 ,但您可以使用适合您插入的维度的任何向量/对象。
replace_dim_boring <- function(arr, rep.val, dim.to.rep, dim.val) {
  dim.list <- as.list(rep(T, length(dim(arr))))
  dim.list[dim.to.rep] <- dim.val
  do.call(`[<-`, c(list(arr), dim.list, list(rep.val)))
}

关于arrays - 将值分配给 R 中数组的特定维度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22520752/

10-15 05:05