如何在R中按索引从数组中提取多个值

3

我有数据框中的索引,希望能够根据这些索引提取数组元素,可以使用简单的子集函数吗?

我有一个三维数组(但适用于任何维数) 例如:

a<-array(1:27,dim = c(3,3,3))

我可以提取单个元素。
a[1,2,3]
[1] 22

我希望能够根据它们的索引提取多个元素。例如,假设我想要提取元素 (1,2,3)=22,(2,2,3)=23 和 (3,1,1)=3,这些元素以表格/数据框的形式给出:

coords <- as.data.frame(rbind(c(1,2,3),c(2,2,3), c(3,1,1)))
colnames(coords) <- c("index1","index2","index3")
coords

  index1 index2 index3
1      1      2      3
2      2      2      3
3      3      1      1

对于一个电话(无法使用)

a[coords$index1,coords$index2,coords$index3]

我希望这个调用的输出结果类似于一个向量,但是没那么幸运。
c(a[1,2,3],a[2,2,3],a[3,1,1])
[1] 22 23  3

我显然可以循环这些索引,但我觉得有些东西我可能错过了..应该有更简单/更好的方法。 我尝试了多种方法和搜索,但我还没有找到任何有效的方法,所以如果这个问题已经有答案了,请谅解。
1个回答

3

你几乎是对的!你可以使用以下代码:

a<-array(1:27,dim = c(3,3,3))
coords <- cbind(rbind(c(1,2,3),c(2,2,3), c(3,1,1)))
colnames(coords) <- c("index1","index2","index3")
coords
a[coords]

区别在于使用cbind而不是as.data.frame以及使用coords访问3D矩阵位置的方式。

总之,必须使用matrix而不是data.frame/list才能访问a的内容。

希望对你有所帮助! :)


1
你可以将初始数据框转换为矩阵 a[as.matrix(coords)] - akrun
1
@akrun 感谢您的提示!总结一下,它必须是一个矩阵而不是数据框或列表,对吗? :) - tk3
1
谢谢你们两位!解决了我的问题!作为这个问题的扩展:如果坐标矩阵包含字符串,这些字符串是每个维度的(dimname)索引,而不是简单的整数索引,这种方法是否可行?或者你需要使用整数矩阵。 - Dave
@user2829168 我认为应该是数字。您可以使用以下方法将chr矩阵转换为数字:class(coords) <- "numeric" - tk3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接