1

長さが異なる 2 つの単一ベクトル データ フレームがあります。

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

関数を作成して適用するという 2 つの方法でそれを行うことができましたが、私のデータセットは大きく、1 つの方法を一晩中実行させました。

私が持っているもの:

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 

2 番目の関数は、すべてのテストでわずかに高速ですが、bb>1.7m および aa>160k のデータセットで最初の関数を一晩中実行しました。

私はこの投稿を見つけ、 with() を使用しようとしましたが、機能しないようで、 for ループも成功せずに試しました。

どんな助けや指示も大歓迎です。

ありがとうございました!

4

2 に答える 2

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 を掛ける必要があります。

それぞれ 100 万データ ポイントを超える土地標高と水位の大きなデータセットを扱っていますが、最終的には浸水曲線を作成しています。超過確率が与えられた水位でどのくらいの土地が浸水するかを知りたい.

したがって、上記の ecdf() 関数を 100 万個のデータ ポイントすべてに使用するのはまだ時間がかかりますが、曲線を作成するのに十分なだけのすべてのデータ ポイントは必要ないことに気付きました。

そこで、土地データ セット全体に 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)

私の結果は同じですが、はるかに高速です。

于 2015-01-05T04:01:54.947 に答える