假设我有以下这样的数据框:
Df <- data.frame(
V1 = c(1,2,3,NA,5),
V2 = c(1,2,NA,4,5),
V3 = c(NA,2,NA,4,NA)
)
现在我想要统计每个两个变量组合的有效观测值数量。为此,我编写了一个名为 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的技巧,我编写了一个函数来返回相同的数据框。请查看下面我的答案中的代码。
crossprod(x)
代替t(x) %*% x
可以稍微提高一下效率。我仍然需要把它放进一个类似例子中的数据框中,但这并不难。 - Joris Meys