2017-06-16 1 views
1

Je voudrais calculer une variable id basée sur la combinaison unique de deux variables (ou plus). Prenons l'exemple simple ci-dessous:Attribuer un ID unique à des lignes équivalentes dans la trame de données

# Example dataframe 
mydf <- data.frame(var1 = LETTERS[c(1, 2, 1)], var2 = LETTERS[c(2, 1, 3)]) 
mydf 

# var1 var2 
# A B 
# B A 
# A C 

Ici, les lignes 1 et 2 devraient avoir la même id parce AB et BA représentent une combinaison des mêmes éléments. La rangée 3 a cependant un id différent puisque la combinaison AC n'apparaît qu'une seule fois.

# Desired output 
cbind(mydf, cid = c(1, 1, 2)) 

# var1 var2 cid 
# A B 1 
# B A 1 
# A C 2 

Une suggestion?

Répondre

1

Vous pouvez bénéficier de factor type dans la base R pour que:

mydf$cid <- as.numeric(factor(apply(mydf,1,function(x) paste0(sort(x), collapse = "")))) 

Il ne tient pas compte de l'ordre par lequel les lignes équivalentes sont apparues dans la trame de données. cumsum ne fonctionne pas une fois, par exemple, les lignes 2 et 3 sont commutés dans votre trame de données.

2

Nous pouvons sort par ligne, créez un vector logique avec duplicated et obtenir le cumsum

cbind(mydf, cid = cumsum(!duplicated(t(apply(mydf, 1, sort))))) 
+1

Echoue si, par exemple, les lignes 2 et 3 sont permutées dans 'mydf'. – 989