【问题标题】:What is the inverse of "arrayInd()" in R?R中“arrayInd()”的逆是什么?
【发布时间】:2020-09-09 03:03:20
【问题描述】:

我想获取一个向量来描述数组中单元格的位置,即“x=c(row, column)”,并返回该位置的标量索引。虽然这可以通过算术来完成,但我试图让我的代码相对容易阅读。 arrayInd 将您的标量索引转换为位置向量对我来说似乎很奇怪,但我无法将位置向量转换回标量索引。

示例代码:

x <- array(seq(0.1,2.7,1), dim=c(3,3,3))
locVec <- c(3,1,1)
mysteryFunc(locVec)

这将返回 3。

arrayInd(x[[mysteryFunc(locVec)]], .dim=dim(x)) 

返回locVec

【问题讨论】:

  • 你能举个小例子吗?也许您需要使用cbinddf1[cbind(row, column)]
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 如果您可以添加一些示例以使其更清晰,那将是很好的。尽管该副本涵盖了相同的领域,但充其量很难遵循。这是对数据的尝试:mat &lt;- matrix(1:10, ncol=2); sca &lt;- (5:8); loc &lt;- (arrayInd(sca, .dim=dim(mat))); 和答案 - replace(mat, , seq_along(mat))[loc]
  • 是的,上面的代码仍然有效,只需要确保 locVec 是一个矩阵 - replace(x, , seq_along(x))[ matrix(locVec, nrow=1) ]

标签: r arrays


【解决方案1】:

将我的评论升级为答案,因为这几个月没有引起注意,previously suggested duplicate 似乎很难理解。

使用您的示例数组x,您可以通过seq_along(x) 使用从1length(x) 的序列replace 整个对象,然后使用包含索引(行/列/层)的matrix /etc...) 来提取索引。例如:

locVec <- c(3,1,1)
replace(x, , seq_along(x))[ matrix(locVec, nrow=1) ]
#[1] 3

这符合您的预期输出。您也可以通过在矩阵选择中添加更多行来对多个值执行此操作:

locMat <- matrix(c(3,1,1,2,2,2), nrow=2, byrow=TRUE)
locMat
#     row  col  stratum
#     [,1] [,2] [,3]
#[1,]    3    1    1
#[2,]    2    2    2

replace(x, , seq_along(x))[ locMat ]
#[1]  3 14

如果你想把它打包成一个不错的功能:

Indarray <- function(x, i) replace(x, , seq_along(x))[ i ]
Indarray(x, locMat)
#[1]  3 14

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多