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