次のようなデータ フレームがあるとします。
Df <- data.frame(
V1 = c(1,2,3,NA,5),
V2 = c(1,2,NA,4,5),
V3 = c(NA,2,NA,4,NA)
)
ここで、2 つの変数の組み合わせごとに有効な観測値の数を数えたいと思います。そのために、関数を書きましたsharedcount:
sharedcount <- function(x,...){
nx <- names(x)
alln <- combn(nx,2)
out <- apply(alln,2,
function(y)sum(complete.cases(x[y]))
)
data.frame(t(alln),out)
}
これにより、次の出力が得られます。
> sharedcount(Df)
X1 X2 out
1 V1 V2 3
2 V1 V3 1
3 V2 V3 2
すべて問題ありませんが、関数自体は大きなデータフレーム (600 の変数と約 10000 の観測) ではかなり時間がかかります。特に cor(...,use='pairwise') は、似たようなことをしなければならないのに、まだずっと速く実行されているので、私はより簡単なアプローチを監督していると感じています:
> require(rbenchmark)
> benchmark(sharedcount(TestDf),cor(TestDf,use='pairwise'),
+ columns=c('test','elapsed','relative'),
+ replications=1
+ )
test elapsed relative
2 cor(TestDf, use = "pairwise") 0.25 1.0
1 sharedcount(TestDf) 1.90 7.6
どんなヒントでも大歓迎です。
注: Vincent のトリックを使用して、同じデータ フレームを返す関数を作成しました。以下の私の答えのコード。