R 比较不等向量与不等式



我有两个长度不等的单向量数据帧

aa<-data.frame(c(2,12,35))
bb<-data.frame(c(1,2,3,4,5,6,7,15,22,36))

对于 aa 中的每个观察结果,我想计算实例数 bb 小于 aa

我的结果:

   bb<aa 
1   1
2   7
3   9

我已经能够通过创建函数和使用 apply 来通过两种方式做到这一点,但我的数据集很大,我让一个整夜无休止地运行。

我有什么:

fun1<-function(a,b){k<-colSums(b<a)
                    k<-k*.000058242}
system.time(replicate(5000,data.frame(apply(aa,1,fun1,b=bb))))
       user  system elapsed 
      3.813   0.011   3.883 

其次

fun2<-function(a,b){k<-length(which(b<a))
                    k<-k*.000058242}
system.time(replicate(5000,data.frame(apply(aa,1,fun2,b=bb))))
   user  system elapsed 
  3.648   0.006   3.664 

第二个函数在我的所有测试中都稍微快一些,但我让第一个函数在 bb>1.7m 和 aa>160k 的数据集上运行了整夜

我找到了这篇文章,并尝试使用 with((,但似乎无法让它工作,也尝试了一个 for 循环但没有成功。

任何帮助或指导不胜感激。

谢谢!

aa<-data.frame(c(2,12,35))
bb<-data.frame(c(1,2,3,4,5,6,7,15,22,36))
sapply(aa[[1]],function(x)sum(bb[[1]]<x))
# [1] 1 7 9

一些更现实的例子:

n  <- 1.6e3
bb <- sample(1:n,1.7e6,replace=T)
aa <- 1:n
system.time(sapply(aa,function(x)sum(bb<x)))
#    user  system elapsed 
#   14.63    2.23   16.87 
n  <- 1.6e4
bb <- sample(1:n,1.7e6,replace=T)
aa <- 1:n
system.time(sapply(aa,function(x)sum(bb<x)))
#    user  system elapsed 
#  148.77   18.11  167.26 

因此,有了length(aa) = 1.6e4,这大约需要 2.5 分钟(在我的系统上(,并且该过程可以扩展为O(length(aa)) - 这并不奇怪。因此,对于完整的数据集,它应该在大约 25 分钟内运行。还是有点慢。也许其他人会想出更好的方法。

我一直在寻找bb的原始帖子次数

所以在我的例子中

aa<-data.frame(c(2,12,35))
bb<-data.frame(c(1,2,3,4,5,6,7,15,22,36))
 x<-ecdf(bb[,1])
 x(2)
[1] 0.2
 x(12)
[1] 0.7
 x(35)
[1] 0.9

为了在我的原始帖子中获得答案,我需要乘以 bb 中的数据点数,在本例中为 10。 虽然第一个不一样,因为我在最初的帖子中说过 bb我正在

处理超过100万个数据点的土地高程和水高程的大型数据集,但最终我正在创建一条淹没曲线。 我想知道在给定概率的情况下,在水位上会淹没多少土地。

因此,在所有 100 万个数据点上使用上述 ecdf(( 函数仍然很耗时,但我意识到我不需要所有足以创建曲线的数据点。

因此,我将 ecdf(( 函数应用于整个土地数据集,但随后创建了一个水的高程序列,该序列足够大以创建我需要的曲线,但又足够小,可以快速计算。

land_elevation <- data.frame(rnorm(1e6))
water_elevation<- data.frame(rnorm(1e6))
cdf_land<- ecdf(land_elevation[,1])
elevation_seq <- seq(from = min(water_elevation[,1]), to = max(water_elevation[,1]), length.out = 1000)
land                  <- sapply(elevation_seq, cdf_land)

我的结果是一样的,但它们要快得多。

最新更新