检查r中的对应关系的最佳方法是什么?

时间:2013-10-02 02:26:24

标签: string r

我试图检查两个变量是否具有一对一的关系。两个变量中的一个包含地址字符,而另一个包含地址的ID。我想看看它是否是一对一的通信。 我在考虑将字符转换为ASCII码或使用数学函数为它们赋值。但我想知道是否还有其他更简单,更有效的方法。

1 个答案:

答案 0 :(得分: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" )

您还可以简单计算您拥有的不同对数: 它应该与x的不同值的数量相同 和y

nrow( unique(d) ) == length(unique(d$x)) && nrow( unique(d) ) == length(unique(d$y))