在二进制数据帧中获得成对比例的一致性

时间:2017-02-16 22:29:28

标签: r binary lapply

我有一个二进制值的数据框,如下所示:

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个数据帧,每个数据帧都有暗淡:250 x 400.我试过dist(df,method=binary)但看起来二进制方法没有考虑(0,0)个实例。

2)为什么当我尝试使用长度(x [1])或长度(x [1])划分时,它不会给我18?在示例中,我通过指定向量new的长度来划分它。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

#Get the combinations
j = combn(x = df, m = 2, simplify = FALSE)

#Get the Proportions
sapply(j, function(x) length(which(x[1] == x[2]))/NROW(x))

正如@thelatemail评论的那样,如果您不关心存储中间组合,您可以立即使用

combn(x = df, m = 2, FUN=function(x) length(which(x[1] == x[2]))/NROW(x))