计算数据帧中不等数的出现次数

时间:2014-02-27 15:35:19

标签: r distance

我有一个包含四列的数据框df。我想找到每对行的不等数的数量。

我尝试使用for循环来完成它并且它完美地运行。但是,运行需要很长时间。请参阅下面的代码:

dist_mat <- matrix(0, nrow(df), nrow(df))
for(i in 1:nrow(df))
{
  for(j in 1:nrow(df))
  {
    dist_mat[i,j] <- sum(df[,1:4][i,]!=df[,1:4][j,])  
  }  
}

我认为还有其他方法可以快速完成这项工作。任何建议表示赞赏。

P.S。数据是数字。

2 个答案:

答案 0 :(得分:1)

鉴于矩阵是对称的,并且对角线将为零,您不需要在每行上循环两次,因此您可以将循环减少一半以上:

for(i in 1:(nrow(df)-1))
{
  for(j in (i+1):nrow(df))
  {
    dist_mat[i,j] <- sum(df[i,1:4]!=df[j,1:4])  
  } 
}

dist_mat[lower.tri(dist_mat)] <- dist_mat[upper.tri(dist.mat)]

答案 1 :(得分:1)

这是combn的作业:

DF <- data.frame(x=rep(1,6), y=rep(1:2,3))

combn(seq_len(nrow(DF)), 2, FUN=function(ind, df) {
  c(ind[1], ind[2], sum(df[ind[1],]!=df[ind[2],]))  
}, df=as.matrix(DF))

请注意,我将data.frame转换为矩阵,因为矩阵子集比data.frame子集更快。根据您的数据类型,这可能会成为一个问题。

如果您的距离测量值不是那么罕见,dist会有所帮助(并且速度很快)。

相关问题