2013-10-02 5 views
0

두 변수가 일대일 관계인지 확인하려고합니다. 두 변수 중 하나는 주소의 문자를 포함하고 다른 하나는 주소에 ID를 포함합니다. 나는 그것이 일대일 대응인지 확인하고 싶습니다. 문자를 ASCII 코드로 변환하거나 수학 함수를 사용하여 값을 할당하려고 생각했습니다. 그러나 그렇게 할 수있는보다 쉽고 효과적인 방법이 있는지 알고 싶습니다.r에 서신을 확인하는 가장 좋은 방법은 무엇입니까

+0

데이터의 * 최소 * 샘플을 제공 할 수 있습니까? 지금이 순간 무슨 뜻인지는 분명하지 않습니다. [훌륭한 재현 가능한 예제 만들기] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – thelatemail

+0

안녕하세요, 오신 것을 환영합니다. 재현 가능한 예제를 만들기 위해'reproduce () '를 사용할 수 있습니다. 지침은 여기에 있습니다 : http://bit.ly/SORepro –

답변

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") 

또한 단순히 당신이 얼마나 많은 다른 쌍 셀 수 : 그것은 xy의의 고유 값의 수와 동일해야합니다.

nrow(unique(d)) == length(unique(d$x)) && nrow(unique(d)) == length(unique(d$y)) 
관련 문제