2013-10-02 133 views
0

我想檢查兩個變量是否有一對一的關係。兩個變量之一包含地址字符,而另一個包含地址的ID。我想看看它是否是一對一的對應關係。 我正在考慮將字符轉換爲ASCII碼或使用數學函數爲它們分配一個值。但是我想知道是否還有其他更簡單,更有效的方法。檢查r中對應關係的最佳方法是什麼

+0

你能提供一個*最小*的數據樣本嗎?目前還不清楚你的意思。請參閱[創建一個偉大的重現示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – thelatemail

+0

你好,歡迎來到SO。爲了提供一個可重現的例子,你可以使用'reproduce()'。說明在這裏:http://bit.ly/SORepro –

回答

4

您可以使用table,並檢查所產生的矩陣有且只有一個1 每一行和每一列中。這也告訴你重複的地方。

d <- data.frame( 
    x = sample(LETTERS, 10, replace=TRUE), 
    y = sample(LETTERS, 10, replace=TRUE) 
) 
m <- table(d) != 0 
all(rowSums(m) == 1) && all(colSums(m) == 1) 

但如果有大量的數據,這是不是很有效。 您可以改用稀疏矩陣。

library(Matrix) 
m <- sparseMatrix(
    i = as.numeric(as.factor(d$x)), 
    j = as.numeric(as.factor(d$y)), 
    x = rep(1, nrow(d)) 
) 
m <- m > 0 
all(rowSums(m) == 1) && all(colSums(m) == 1) 

您也可以使用sqldf

library(sqldf) 
sqldf("SELECT x, COUNT(DISTINCT y) AS n FROM d GROUP BY x HAVING n > 1") 
sqldf("SELECT y, COUNT(DISTINCT x) AS n FROM d GROUP BY y HAVING n > 1") 

你也可以簡單地算你有多少不同,對有: 應該是一樣的xy和不同值的數量。

nrow(unique(d)) == length(unique(d$x)) && nrow(unique(d)) == length(unique(d$y)) 
相關問題