【发布时间】:2014-12-05 18:52:51
【问题描述】:
我有两个长度不等的单向量数据帧
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
我已经能够通过创建一个函数和使用应用两种方式来做到这一点,但是我的数据集很大,我让一个运行一整夜没有结束。
我有什么:
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 的数据集上运行了一整夜
我找到了this post,并尝试使用 with() 但似乎无法使其正常工作,还尝试了 for 循环但没有成功。
感谢任何帮助或指导。
谢谢!
【问题讨论】:
-
它们必须是数据框吗?为什么不只是向量?你试过
sapply(aa[[1]],function(x)sum(bb[[1]]<x))吗?如果aa和bb非常向量,这将是更重要的。 -
一个向量很好,我的初始数据在一个数据框中,但如果它可以在 2 个向量上完成,那就太好了。
标签: r for-loop vectorization apply inequality