0
我想检查两个变量是否有一对一的关系。两个变量之一包含地址字符,而另一个包含地址的ID。我想看看它是否是一对一的对应关系。 我正在考虑将字符转换为ASCII码或使用数学函数为它们分配一个值。但是我想知道是否还有其他更简单,更有效的方法。检查r中对应关系的最佳方法是什么
我想检查两个变量是否有一对一的关系。两个变量之一包含地址字符,而另一个包含地址的ID。我想看看它是否是一对一的对应关系。 我正在考虑将字符转换为ASCII码或使用数学函数为它们分配一个值。但是我想知道是否还有其他更简单,更有效的方法。检查r中对应关系的最佳方法是什么
您可以使用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))
你能提供一个*最小*的数据样本吗?目前还不清楚你的意思。请参阅[创建一个伟大的重现示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – thelatemail
你好,欢迎来到SO。为了提供一个可重现的例子,你可以使用'reproduce()'。说明在这里:http://bit.ly/SORepro –