我有一个包含二进制值的数据框,格式如下:
df<-data.frame(a=rep(c(1,0),9),b=rep(c(0,1,0),6),c=rep(c(0,1),9))
目的是首先获取所有成对组合:
combos <- function(df, n) {
unlist(lapply(n, function(x) combn(df, x, simplify=F)), recursive=F)
}
combos(df,2)->j
接下来我想要得到列表 j 中每个数据框中两列均为 (0,0) 或 (1,1) 的比例。可以这样获取比例:
lapply(j, function(x) data.frame(new = rowSums(x[,1:2])))->k
lapply(k, function(x) data.frame(prop1 = length(which(x==1))/18,prop2=length(which(x==0|x==2))/18))
然而,这对于较大的列表似乎效率低且复杂。几个问题: 1)有没有比这更快/更好的方法?我的实际列表包括20个数据框,每个数据框的dim为:250 x 400。我尝试了
dist(df,method=binary)
,但它似乎不考虑(0,0)实例。
2)还有为什么当我尝试使用length(x[1])或lengths(x[1] )进行除法运算时,它不会给我18呢?在示例中,我通过指定向量new
的长度来进行除法运算。
非常感谢任何帮助!
crossprod
--mdf = as.matrix(df); (crossprod(mdf) + crossprod(!mdf)) / nrow(mdf)
。 - alexis_laz