0

Rでは、関数の出力に対して「即時」の論理インデックスを実行することは可能ですか?

このややあいまいな質問を明確にするために、多くの人が以前に出くわしたと確信している日常の小さな例を次に示します。次のようなベクトル「データ」があるとします。

data <- c(1,1,3,5,6,6,8,10,14,15,15,20)

関数「tabulate」をこのベクトルに適用すると、結果は次のようになります。

tabulate(data)
 [1] 2 0 1 0 1 2 0 1 0 1 0 0 0 1 2 0 0 0 0 1

ただし、(この場合) 非ゼロであるベクトルのエントリのみにアクセスすることが望ましいことがよくあります。

tabulate(data)[tabulate(data) != 0]
[1] 2 1 1 2 1 1 1 2 1

ただし、この場合、"tabulate(data) を 2 回計算する必要があり、非効率的または無駄にさえ思えます。少なくとも、これは明らかにエレガントではありません。同様に、"tabulate(data) の結果を一時変数に格納すると、大規模なデータセットを扱う場合は面倒です。

私の質問は次のとおりです。この種の問題に対するシンプルでより洗練された (構文上の) 回避策はありますか? 仕事をする「魔法の」direct.index関数のようなものはありますか? そのようです、

direct.index(tabulate.data, condition='!= 0')

...基本的に、計算時にインデックス条件を満たさないすべての値を破棄し、プロセス全体をより高速かつ効率的にします。

簡単にするために、「集計」結果からのゼロ除去に関する具体的な問題をここに示します。実際、私はこれについて非常に多くの異なる状況で頭を悩ませてきました。たぶん、私はRについていくつかの基本的な誤解も持っています...

ところで、「?subset」について調べてみたのですが、探しているものではないようです。

4

1 に答える 1

2

手で書かれた関数のバージョン

direct.index <- function(x, condition, value){
  index <- eval(call(condition, x, value))
  x[which(index)]
}

direct.index(tabulate(data), '!=', 0)
## [1] 2 1 1 2 1 1 1 2 1

しかし、私はあなたが機能を探していると思いますtable

table(data)
## data
## 1  3  5  6  8 10 14 15 20 
## 2  1  1  2  1  1  1  2  1 
于 2012-06-26T01:42:46.780 に答える