通过R中的数组索引向量

时间:2014-12-05 20:50:59

标签: r matlab numpy

在MATLAB和numpy中,您可以通过索引数组索引向量并获得相同形状的结果,例如

A = [1 1 2 3 5 8 13];
B = [1 2; 2 6; 7 1; 4 4];
A(B)

## ans =
##  
##     1    1
##     1    8
##    13    1
##     3    3

import numpy as np
a = np.array([1, 1, 2, 3, 5, 8, 13])
b = np.reshape(np.array([0, 1, 1, 5, 6, 0, 3, 3]), (4, 2))
a[b]

## array([[ 1,  1],
##        [ 1,  8],
##        [13,  1],
##        [ 3,  3]])

但是,在R中,通过索引数组索引向量会返回一个向量:

a <- c(1, 1, 2, 3, 5, 8, 13)
b <- matrix(c(1, 2, 7, 4, 2, 6, 1, 4), nrow = 4)
a[b]

## [1]  1  1 13  3  1  8  1  3

R中是否有惯用的方法来执行保留数组形状的矢量化查找?

3 个答案:

答案 0 :(得分:2)

这不是很优雅,但它有效

matrix(a[b],nrow=nrow(b))

答案 1 :(得分:2)

您无法在R(AFAIK)中单独通过子集指定尺寸。这是一个解决方法:

`dim<-`(a[b], dim(b))

产地:

     [,1] [,2]
[1,]    1    1
[2,]    1    8
[3,]   13    1
[4,]    3    3

dim<-(...)只允许我们将尺寸设置功能dim<-用于其结果,而不是通常情况下的副作用。

您还可以执行以下操作:

t(apply(b, 1, function(idx) a[idx]))

但这会很慢。

答案 2 :(得分:1)

选项1:如果我们不需要将原始值保留在b中,我们可以简单地

"Caveat: the values in b will be over-written"
b[] = a[b]
b
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    8
# [3,]   13    1
# [4,]    3    3

选项2:如果想要保留b中的值,可以采用简单的解决方法

c = b  # copy b to c
c[] = a[c]
c
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    8
# [3,]   13    1
# [4,]    3    3

实际上我发现选项2很容易理解和清理。