将矢量与矩阵中的选定元素进行比较

时间:2013-05-10 07:20:50

标签: r vector matrix compare

我想比较一个巨大的向量与R中矩阵中的选定元素。

A是矩阵,B是矢量。我想比较B的每个元素和来自A的选定元素.C和D是选择标准。它们是与B长度相同的向量.C指定A的行号,D指定列号。 A的维数为10 * 100,B,C,D都是长度为72000的向量。代码为for循环:

for ( j in 1:length(B) ){
  E[j] <- B[j] >= A[ C[j], D[j] ]
} 

这太慢了。我通过定义一个包含来自A的元素的向量来对此进行矢量化:

A1 <- array(0, length(B))
A2 <- A[,D]
for ( j in 1:length(B) ){
  A1[j] <- A2[ C[j], j ]
}   
E <- B >= A1

这仍然太慢了。有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以根据选择标准B和C轻松选择与B的每个条目对应的A的每个元素。将B和C组合成一个双列矩阵,然后用该矩阵组合A:

A.subset <- A[cbind(B, C)]

你现在有一个与B长度相同的矢量(A.subset),并且可以以高效的方式执行你喜欢的任何(矢量化)比较。

答案 1 :(得分:1)

我能想到的绝对最快的方法是将A视为向量并提取所需的元素。矩阵 实际上只是一个具有维度属性的向量。算术运算非常快,[子集运算符是矢量化的。

要获得所需的元素,您需要做的就是将所需的列号(D)乘以总行数,然后减去所需的行号(C)减去总数行,例如A[ D * nrow(A) - ( nrow(A) - C) ],例如:

set.seed(1234)
A <- matrix( sample(5,16,repl=TRUE) , 4 )
#    [,1] [,2] [,3] [,4]
#[1,]    2    1    1    5
#[2,]    1    3    5    5
#[3,]    2    1    1    2
#[4,]    1    4    2    1

## Rows
C <- sample( nrow(A) , 3 , repl = TRUE )
#[1] 1 2 3

## Columns
D <- sample( ncol(A) , 3 , repl = TRUE )
#[1] 1 3 2

## Treat A as a vector
## Elements are given by:
rs <- nrow(A)
A[ D * rs - ( rs - C) ]
#[1] 2 5 1

答案 2 :(得分:0)

我不确定我是否完全接受了您的问题,但我认为您需要以下内容:

# setup some mock data
a <- matrix(rnorm(1000,0,1),nrow=10, ncol=100)
b <- rnorm(100,0,1)
c <- rep(1:10,10)
d <- 1:100

# define function
compare <- function(v,row,column)
    return(v >= a[row,column]) # you might want this to output to something else

# apply the comparison function to the b, c, and d vectors
mapply(FUN=compare, b, c, d)