[英]R comparing unequal vectors with 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> 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萬個數據點上使用上述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)
我的結果是相同的,但是速度要快得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.