2013-10-02 4 views
0

J'essaie de vérifier si deux variables ont une relation un à un. Une des deux variables contient des caractères d'adresse, tandis que l'autre contient un ID à l'adresse. J'aimerais voir s'il s'agit d'une correspondance un à un. Je pensais convertir des caractères en code ASCII ou leur attribuer une valeur en utilisant une fonction mathématique. Mais je veux savoir s'il existe d'autres moyens plus faciles et plus efficaces de le faire.Quelle est la meilleure façon de vérifier la correspondance dans

+0

Pouvez-vous fournir un échantillon * minimal * de vos données? On ne sait pas ce que vous voulez dire en ce moment. Voir [créer un excellent exemple reproductible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – thelatemail

+0

Bonjour et bienvenue sur SO. Pour vous aider à créer un exemple reproductible, vous pouvez utiliser 'reproduire ()'. Les instructions sont ici: http://bit.ly/SORepro –

Répondre

4

Vous pouvez utiliser table et vérifier si la matrice résultante a exactement 1 dans chaque ligne et dans chaque colonne. Cela vous indique également où sont les doublons.

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) 

Mais s'il y a beaucoup de données, ce n'est pas très efficace. Vous pouvez utiliser une matrice creuse à la place.

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) 

Vous pouvez également utiliser 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") 

Vous pouvez aussi simplement compter le nombre de paires différentes que vous avez: il devrait être le même que le nombre de valeurs distinctes de x et de y.

nrow(unique(d)) == length(unique(d$x)) && nrow(unique(d)) == length(unique(d$y)) 
Questions connexes