R比较不等向量与不等式

时间:2014-12-05 18:52:51

标签: r for-loop vectorization apply inequality

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

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&gt; 1.7m和aa&gt; 160k

的数据集上整夜运行

我找到this post,并尝试使用with()但似乎无法使其工作,也尝试了for循环但没有成功。

感谢任何帮助或指示。

谢谢!

2 个答案:

答案 0 :(得分:2)

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分钟内运行。仍然有点慢。也许其他人会想出更好的方法。

答案 1 :(得分:0)

我原来的帖子我一直在寻找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)

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