将数组与标量进行比较

时间:2015-07-10 12:06:23

标签: arrays r scalar

问题:

我希望比较一个二维数组和一个标量变量,两者的数值均为(< =)lessthanorequalto operation,并将数组中的所有值分配给一个向量。

我希望加速R 中的这项任务。

现在,下面是我正在使用的代码(显然非常耗时)

我现在正在使用的代码:

2d_examplearray; #我的二维数组实际大小3500 X 4200    my_scalarvariable = 5; #一些任意值,因为这是一个例子

dims_2darray =暗淡(2d_examplearray); #得到否。行和列信息

# First create and then initialize vectors for storing values accordingly as specified in if # condition below

eachelementin_ltvector<-vector();
eachelementin_gtvector<-vector();

eachelementin_ltvector=1;
eachelementin_gtvector=1;

for (eachrow in 1 : dims_2darray[1])
{
for (eachcol in 1 : dims_2darray[2])
{
if(2d_examplearray[eachrow,eachcol]<my_scalarvariable)
{
vector_lessthanvalue[eachelementin_ltvector]=2d_examplearray[eachrow,eachcol];
eachelementin_ltvector=eachelementin_ltvector+1;
}
else # greater than or equal to my scalar variable then
{
vector_greaterthanvalue[eachelementin_gtvector]=2d_examplearray[eachrow,eachcol];
eachelementin_gtvector=eachelementin_gtvector+1;
}
}
}

感谢我之前关于同一问题的帖子的输入。 我是R和这个Q&amp; A论坛的新手。

再次感谢

3 个答案:

答案 0 :(得分:0)

您需要提供reproducible example,但您的解决方案可能是

形式
m= 3 # 3500
n= 4 # 4200
set.seed(123)
m <- matrix(rnorm(m*n), m, n)
m
#            [,1]       [,2]       [,3]       [,4]
# [1,] -0.5604756 0.07050839  0.4609162 -0.4456620
# [2,] -0.2301775 0.12928774 -1.2650612  1.2240818
# [3,]  1.5587083 1.71506499 -0.6868529  0.3598138

v = 1.5 # the value you want elements less than or equal to

m <= v
#       [,1]  [,2] [,3] [,4]
# [1,]  TRUE  TRUE TRUE TRUE
# [2,]  TRUE  TRUE TRUE TRUE
# [3,] FALSE FALSE TRUE TRUE

但是你需要指定矩阵从两个维度到一个维度的映射方式。

例如,你可以做

unlist(m[m <= v])

你可以看到从上到下,从左到右。

#    [1] -0.56047565 -0.23017749  0.07050839  0.12928774  0.46091621 -1.26506123 -0.68685285 -0.44566197  1.22408180  0.35981383

答案 1 :(得分:0)

从您的问题我不能说这是否正是您所寻找的,但我创建了一个可能有用的示例:

mat <- matrix(1:14700000, 3500, 4200)

vector <- c(-1:-1000000)
scalar <- 1000000
mat[mat <= scalar]  <- c(-1:-1000000)

请注意,vector必须与要替换的元素的长度相同。

答案 2 :(得分:0)

'哪个'可能有用:

> A <- matrix( sample(3500*4200)/(3500*4200),3500,4200 )

> b <- 0.3

> v <- A[which(A<=b)]

> system.time( for (n in 1:100) { A[which(A<=b)] } )
       User      System verstrichen 
      30.61        6.05       37.78 

> summary(v)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
7.00e-08 7.50e-02 1.50e-01 1.50e-01 2.25e-01 3.00e-01 

> w <- unlist(A[A<=b])

> system.time( for ( n in 1:100) { unlist(A[A<=b]) } )
       User      System verstrichen 
      32.51        7.22       40.14 

> summary(w)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
7.00e-08 7.50e-02 1.50e-01 1.50e-01 2.25e-01 3.00e-01 

> identical (v,w)
[1] TRUE