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.
4 Réponses :
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>
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
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]))))
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))) où m <- ncol (TableTest [-1])
Oui, je suis d'accord avec @Onyambu.
@Onyambu Merci pour le rappel! J'ai oublié cette simplification.
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
})))
a donné le même résultat. Ceci est une autre approche