2
votes

Création de vecteurs conditionnés à partir d'un autre vecteur

Je suis un nouvel utilisateur dans R. Compte tenu de l' example <- c (15 1 1 1 7 8 8 9 5 9 5) vecteur suivant example <- c (15 1 1 1 7 8 8 9 5 9 5) , je voudrais créer deux vecteurs supplémentaires, le premier avec uniquement les nombres répétés et le second avec des nombres qui ne sont pas répétés, quelque chose comme:

example1 <- c (15, 7)

example2 <- c (1, 8, 9, 5)

Merci pour votre soutien.


0 commentaires

3 Réponses :


1
votes

Vous pouvez compter les apparences des valeurs à l'aide du table :

repeatedValues <- as.numeric(names(tt)[tt>1])
uniqueValues <- as.numeric(names(tt))[tt==1]

Les noms de la table sont les valeurs comptées, vous pouvez donc écrire:

example <- c(15,1,1,1,7,8,8,9,5,9,5)
tt <- table(example)


1 commentaires

Merci @Jonas. Votre réponse est très intuitive, elle a bien fonctionné.



2
votes

En utilisant l' example montré de manière reproductible dans la note à la fin, les dups sont formés à partir des éléments dupliqués et les singles sont le reste, cela donne toujours deux vecteurs (l'un sera de longueur nulle s'il n'y a pas de doublons ou s'il n'y a pas de singles) et il utilise le valeurs numériques directement sans les convertir en caractère.

example <- scan(text = "15 1 1 1 7 8 8 9 5 9 5", quiet = TRUE)

Remarque

L'entrée indiquée dans la question n'était pas une syntaxe R valide, nous fournissons donc l'entrée de manière reproductible ici:

dups <- unique(example[duplicated(example)])
singles <- setdiff(example, dups)

dups
## [1] 1 8 9 5

singles
## [1] 15  7


1 commentaires

Merci beaucoup @G. Grothendieck, cela a parfaitement fonctionné.



0
votes

Voici un one-liner utilisant rle qui met les vecteurs résultants dans une liste:

split(rle(sort(example))$values, rle(sort(example))$lengths < 2)
#> $`FALSE`
#> [1] 1 5 8 9

#> $`TRUE`
#> [1]  7 15


4 commentaires

La liste aura un composant s'il n'y a pas de dups ou pas de singles par opposition à deux composants avec un vide.


@ G.Grothendieck oui, je sais. Son utilisation dans le code de production nécessiterait une ligne supplémentaire comme contrôle existentiel. Je pense que votre réponse est la meilleure des trois et que vous avez voté pour, mais j'ai pensé illustrer une approche différente de l'utilisation du table et du duplicata unique.


@ Nuñes c'est un encodage de longueur d'exécution. Il convertit un vecteur en une liste de deux vecteurs plus courts - l'un donnant les valeurs, l'autre la longueur des valeurs. Si vous triez d'abord le vecteur, il agira un peu comme un table , sauf que les valeurs ne sont pas converties en caractères. rle est une astuce utile à avoir dans votre manche.


Excellent @Allan Cameron, c'était très clair. C'est vraiment une fonction très utile, surtout quand on veut une sortie numérique. Merci.