4

ベクトルがあり、その固有の要素(ここでは1と2)がわからないとします。

vec <-
  c(1, 1, 1, 2, 2, 2, 2)

vecつまり、と同じ結果で一意の要素の数を取得するためのより良い方法(またはエレガントな方法)があるかどうかを知りたいと思いましたtable(vec)。それがdata.frameであるか、名前付きベクトルであるかは関係ありません。

R> table(vec)
vec
1 2 
3 4 

理由:もっと良い方法があるかどうか知りたいと思いました。また、 (。C呼び出しに加えて)実装にforループがあることに気づきました。baseそれが大きな懸念事項かどうかはわかりませんが、

R> table(rep(1:1000,100000))

Rは本当に長い時間がかかります。膨大な数の100000のせいだと思いますが、もっと速くする方法はありますか?

編集Chase'sこれは答えに加えてまた良い仕事をします。

R> rle(sort(sampData))
4

1 に答える 1

9

これは興味深い問題です-私はこれについて他の考えを見ることに興味があります。のソースを見ると、table()から構築されていることがわかりtabulate()ます。tabulate()明らかにいくつかの癖があります。つまり、正の整数のみを処理し、名前のない整数ベクトルを返します。unique()ベクトルで使用して、を適用できますnames()。ゼロまたは負の値を表にする必要がある場合は、ヘルプページの例ではそうは思われないので、戻ってtable()確認する必要があると思います。tabulate()

table2 <- function(data) {
    x <- tabulate(data)
    y <- sort(unique(data))
    names(x) <- y
    return(x)   
    }

そして簡単なテスト:

> set.seed(42)
> sampData <- sample(1:5, 10000000, TRUE, prob = c(.3,.25, .2, .15, .1))
> 
> system.time(table(sampData))
   user  system elapsed 
  4.869   0.669   5.503 
> system.time(table2(sampData))
 user  system elapsed 
0.410   0.200   0.605
> 
> table(sampData)
sampData
      1       2       3       4       5 
2999200 2500232 1998652 1500396 1001520 
> table2(sampData)
      1       2       3       4       5 
2999200 2500232 1998652 1500396 1001520 

編集:私はちょうどの代わりとなるcount()関数があることに気づきました。上記のテストでは、パフォーマンスは、私がまとめたハックジョブソリューションよりも優れており、わずかに劣っています。plyrtable()table()

library(plyr)
 system.time(count(sampData))
   user  system elapsed 
  1.620   0.870   2.483
于 2010-12-20T03:18:59.257 に答える