假设我有这样的数据框:
Df <- data.frame(
V1 = c(1,2,3,NA,5),
V2 = c(1,2,NA,4,5),
V3 = c(NA,2,NA,4,NA)
)
Run Code Online (Sandbox Code Playgroud)
现在我想计算两个变量的每个组合的有效观察数.为此,我写了一个函数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)
}
Run Code Online (Sandbox Code Playgroud)
这给出了输出:
> sharedcount(Df)
X1 X2 out
1 V1 V2 3
2 V1 V3 1
3 V2 V3 2
Run Code Online (Sandbox Code Playgroud)
一切都很好,但功能本身在大数据帧上需要很长时间(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
Run Code Online (Sandbox Code Playgroud)
任何提示都表示赞赏.
注意:使用Vincent的技巧,我编写了一个返回相同数据框的函数.代码在我的答案中.