我有一个包含四列的数据框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。数据是数字。
答案 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
会有所帮助(并且速度很快)。