在二元数据框中获取一对一的一致比例

4

我有一个包含二进制值的数据框,格式如下:

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
1个回答

4
#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))

2
您可以使用combnFUN=参数在一次调用中完成所有操作 - combn(x = df, m = 2, FUN=function(x) length(which(x[1] == x[2]))/NROW(x)) - thelatemail
哇,太棒了...我怎么会忘记nrow/length的区别呢!谢谢。 - thisisrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接