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