1

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

4

1 回答 1

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))
于 2013-10-02T06:54:28.593 回答