Je voudrais identifier et marquer les lignes en double sur la base de 2 colonnes. Je voudrais faire un identifiant unique pour chaque doublon, donc je sais non seulement que la ligne est un doublon, mais avec quelle ligne c'est un doublon. J'ai une trame de données qui ressemble à ci-dessous avec quelques paires d'éléments en double (sur ajustement et assis) et d'autres paires qui ne sont pas dupliquées. Alors que les paires d'articles sont dupliquées, les informations qu'elles contiennent sont uniques (par exemple, une ligne aura une valeur dans Value1 pour 1 ligne, mais pas Value2 et Value 3, la seconde ou la ligne 'dupliquée' aura des nombres pour Value2 et Value3 juste pas Value1)
trame de données actuelle
value1 value2 value3 fit sit
[1,] "1" NA NA "it1" "it2"
[2,] NA "3" "2" "it2" "it1"
[3,] "2" "3" "4" "it3" "it4"
[4,] NA NA NA "it4" "it3"
[5,] "5" NA NA "it5" "it6"
[6,] NA NA "2" "it6" "it5"
[7,] NA "4" NA "it7" "it9"
code pour générer un exemple de trame de données
value1<-c(1,NA,2,NA,5,NA,NA)
value2<-c(NA,3,3,NA,NA,NA, 4)
value3<-c(NA,2,4,NA,NA,2, NA)
fit<-c("it1","it2","it3","it4", "it5", "it6","it7")
sit<-c("it2","it1","it4","it3", "it6", "it5", "it9")
df.now<-cbind(value1,value2,value3, fit, sit)
ce que je veux, c'est le convertir en une trame de données qui ressemble à ceci:
trame de données souhaitée
val1 val2 val3 it1 it2
[1,] "1" "3" "2" "it1" "it2"
[2,] "2" "3" "4" "it3" "it4"
[3,] "5" NA "2" "it5" "it6"
[4,] NA "4" NA "it7" "it9"
Je pensais faire les étapes suivantes: 1. créer de nouvelles variables en utilisant l'ajustement et s'asseoir avec l'élément le plus bas et les éléments les plus élevés pour identifier les paires en double 2. identifier les paires d'éléments en double 3. utiliser ifelse pour sélectionner et remplir des informations uniques.
Je sais comment faire les étapes 1 et 3, mais je suis coincé à l'étape 2. Je pense que ce que je dois faire n'est pas seulement d'identifier les doublons VRAI / FAUX, mais peut-être d'avoir une colonne avec un identifiant unique pour chaque paire d'articles comme ceci (il sont 2 lignes supplémentaires en raison de mon étape 1):
value1 value2 value3 fit sit lit hit dup
[1,] "1" NA NA "it1" "it2" "it1" "it2" 1
[2,] NA "3" "2" "it2" "it1" "it1" "it2" 1
[3,] "2" "3" "4" "it3" "it4" "it3" "it4" 2
[4,] NA NA NA "it4" "it3" "it3" "it4" 2
[5,] "5" NA NA "it5" "it6" "it5" "it6" 3
[6,] NA NA "2" "it6" "it5" "it5" "it6" 3
[7,] NA "4" NA "it7" "it9" "it7" "it9" NA
Je ne sais pas comment procéder.
Ce que je demande, c'est soit de l'aide pour l'étape 2, soit il existe peut-être une meilleure façon de le résoudre que les étapes que j'ai décrites.
Utiliser
!duplicated()
aprèssort
ing.la source
Utilisation
melt/dcast
dedata.table
Les données
la source
Une autre
data.table
option:production:
la source
Voici ma tentative d'utilisation de data.table. Vos données sont appelées
mydf
. Tout d' abord, je triaifit
etsit
pour chaque ligne et créé une nouvelle variable,group
. Ensuite, pour chaque groupe, j'ai trié les valeurs dans les trois colonnes de valeurs (c.-à-d. Valeur1, valeur2 et valeur3). Enfin, j'ai extrait la première ligne pour chaque groupe.LES DONNÉES
la source
Cela peut également être fait en utilisant
tidyr
'spivot_longer
avecvalues_drop_na = TRUE
combiné avecpivot_wider
:Les données
la source