问题:
我希望比较一个二维数组和一个标量变量,两者的数值均为(< =)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论坛的新手。
再次感谢
答案 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