0
votes

Recherche de doublons par colonnes dans r

Je souhaite rechercher les doublons horizontalement et conserver les uniques. S'il vous plait, j'ai besoin de votre aide avec ceci. Je partage un exemple de jeu de données. J'espère que cela vous aidera.

 X           Y           Z  S
1 1       India          NA NA
2 2       India      France NA
3 3 Philippines Netherlands NA
4 4 Netherlands      France NA
5 5      France       India NA

Ensemble de données d'entrée

 X           Y           Z           S
1 1       India       India       India
2 2       India       India      France
3 3 Philippines Netherlands Netherlands
4 4 Netherlands      France      France
5 5      France      France       India

Résultat attendu

X <- c(1,2,3,4,5)
Y <- c("India","India","Philippines","Netherlands","France")
Z <- c("India","India","Netherlands","France","France")
S <- c("India","France","Netherlands","France","India")
TableTest <- data.frame(X,Y,Z,S)
TableTest 

S'il vous plaît aide.


0 commentaires

4 Réponses :


2
votes
TableTest[,-1] <- as.data.frame(t(apply(TableTest[,-1], 1, function(a) { a <- replace(a, duplicated(a), NA_character_); a[ order(is.na(a)) ]; })))
TableTest
#   X           Y           Z    S
# 1 1       India        <NA> <NA>
# 2 2       India      France <NA>
# 3 3 Philippines Netherlands <NA>
# 4 4 Netherlands      France <NA>
# 5 5      France       India <NA>

0 commentaires

0
votes

Je ne pense pas que vous puissiez le faire en utilisant uniquement data.frames, car vous déplacez des valeurs d'une colonne à l'autre. Mais voici une façon de le faire en utilisant des matrices:

X <- c(1,2,3,4,5)
Y <- c("India","India","Philippines","Netherlands","France")
Z <- c("India","India","Netherlands","France","France")
S <- c("India","France","Netherlands","France","India")

output <- apply(cbind(Y,Z,S), 1, function(row) {
    rm_dup <- unique(row)
    return(c(rm_dup, rep(NA_character_,
                         3 - length(rm_dup))))
})

t(output)

     [,1]          [,2]          [,3]
[1,] "India"       NA            NA  
[2,] "India"       "France"      NA  
[3,] "Philippines" "Netherlands" NA  
[4,] "Netherlands" "France"      NA  
[5,] "France"      "India"       NA  


0 commentaires

2
votes

Une autre option de base R

> TableTest
  X           Y           Z    S
1 1       India        <NA> <NA>
2 2       India      France <NA>
3 3 Philippines Netherlands <NA>
4 4 Netherlands      France <NA>
5 5      France       India <NA>

ou une version plus simple ( merci pour les conseils de @Onyambu dans les commentaires )

TableTest[-1] <- t(apply(TableTest[-1], 1, function(x)`length<-`(unique(x),ncol(TableTest[-1]))))


3 commentaires

Vous utilisez déjà apply. pourquoi réutiliser lapply ?? essayez le code suivant. Il est un peu plus court t (apply (TableTest [-1], 1, function (x) `length <-` (unique (x), m))) m <- ncol (TableTest [-1])


Oui, je suis d'accord avec @Onyambu.


@Onyambu Merci pour le rappel! J'ai oublié cette simplification.



1
votes

Ma solution:

> TableTest
  X           Y           Z    S
1 1       India        <NA> <NA>
2 2       India      France <NA>
3 3 Philippines Netherlands <NA>
4 4 Netherlands      France <NA>
5 5      France       India <NA>

Sortie

  TableTest[2:4] <- as.data.frame(t(apply(TableTest[2:4], 1, function(x) {
  xo <- ifelse(!duplicated(x), x, NA_character_)
  if (any(is.na(xo))) xo <- xo[!is.na(xo)]
  length(xo) <- ncol(TableTest) - 1
  xo
  })))


1 commentaires

a donné le même résultat. Ceci est une autre approche