所以我有一个输入向量"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正在按值而不是所有向量进行计算.
请帮忙.对不起,如果有任何不良格式,这是我的第一篇文章.
让我试着说明我在上面讲道的内容.首先是一个小例子:
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)