如何让R中的这段代码更快?我正在检查向量的值是否属于一个范围,我返回一个逻辑向量

0 performance r vector

所以我有一个输入向量"Vin",我有两个数据帧来与该向量进行比较.这些数据帧DMAX和DMIN包含我想要检查我的输入值是否在各自位置的范围内的值范围.

for (i in 1:nrow(DMIN)){
V2 <- Vin >= DMIN[i,2:521] & Vin <= DMAX[i,2:521]
V1[i] <- length(V2[V2 == FALSE])
}
Run Code Online (Sandbox Code Playgroud)

我注意到V2计算很慢,也许R正在按值而不是所有向量进行计算.

请帮忙.对不起,如果有任何不良格式,这是我的第一篇文章.

42-*_*42- 5

让我试着说明我在上面讲道的内容.首先是一个小例子:

setseed(1949)
Dmin <- as.data.frame( matrix( runif(80), 10) )
Dmax <- as.data.frame( matrix( runif(80), 10) )
for (i in 1:nrow(Dmin)){
V2 <- Vin >= Dmin[i,2:8] & Vin <= Dmax[i,2:8]
V1[i] <- length(V2[V2 == FALSE])
}
V1
# [1] 5 6 5 4 7 6 4 7 6 3
Run Code Online (Sandbox Code Playgroud)

通常,尝试找到使用像rowSums这样的矢量化函数的解决方案会更有效.我你会知道第2-8列(或者你的情况是521)中的项目数量的行数,其中Vin不在DMAX和DMIN的每个col-row配对的范围内(虽然我不喜欢按住shift键,所以它们被命名为Dmin abd Dmax)):

这似乎提供了一个"无循环"的解决方案:

(V1 <-rowSums( !( Vin >= Dmin[-1] &Vin <= Dmax[-1])  ) )
 [1] 5 6 5 4 7 6 4 7 6 3
Run Code Online (Sandbox Code Playgroud)