2013-10-02 177 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)) 
相关问题