2014-02-27 59 views
0

我有一個有四列的數據幀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.數據是數字。

回答

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)] 
+0

謝謝你的回答。我曾考慮過這種方法。由於我執行的下一步,我需要生成整個矩陣。 – Chris

+0

@Chris它確實產生了整個矩陣,但由於它是對稱的,所以你只需要做一半,然後複製它。 – James

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將是有益的(和快速)。

+0

謝謝你的回答。這是正確的,如果不是我的距離測量,dist會節省我的時間。對不起,如果我錯過了一些東西,但我不明白你的答案。我期待着一個包含成對距離的'6×6'矩陣。但是'df'產生的是一個'3×15'矩陣。你能解釋你的答案嗎?謝謝! – Chris

+0

你在上部(或下部對角線)有15個測量;這是第三列中的內容。 – Aaron

相關問題