Existe-t-il un moyen plus simple de s'assurer que les lignes d'un bloc de données sont ordonnées selon un vecteur «cible» comme celui que j'ai implémenté dans le court exemple ci-dessous?
df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))
df
# name value
# 1 a TRUE
# 2 b TRUE
# 3 c FALSE
# 4 d FALSE
target <- c("b", "c", "a", "d")
Cela semble en quelque sorte un peu trop "compliqué" pour faire le travail:
idx <- sapply(target, function(x) {
which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL
df
# name value
# 1 b TRUE
# 2 c FALSE
# 3 a TRUE
# 4 d FALSE
b,c,a,d,b,c,a,d
. J'ai essayématch
mais ça ne marche pas bien.match()
. Ce qui me vient à l'espritduplicated()
, c'estunique()
une autre routine personnalisée qui "garde" les éléments désirés tout en jetant les autres. HTHdf <- data.frame(name=letters[c(1:4, 1:4)], value=c(rep(TRUE, 2), rep(FALSE, 2),rep(TRUE, 2), rep(FALSE, 2) )) target <- c("b", "c", "a", "d") df[order(unlist(sapply(df$name, function(x) which(target == x)))),]
Je préfère utiliser
***_join
dansdplyr
chaque fois que je dois faire correspondre les données. Un essai possible pour celaNotez que l'entrée pour
***_join
require tbls ou data.framela source
dplyr
sont vraiment sympas. Finissez par les utiliser beaucoup maintenant aussitarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Cette méthode est un peu différente, elle m'a fourni un peu plus de flexibilité que la réponse précédente. En le transformant en un facteur ordonné, vous pouvez l'utiliser à bon escient
arrange
et ainsi de suite. J'ai utilisé reorder.factor dugdata
package.Ensuite, utilisez le fait qu'il est maintenant commandé:
Si vous souhaitez revenir à l'ordre d'origine (alphabétique), utilisez simplement
as.character()
pour le remettre à l'état d'origine.la source
setDT(df)[ , name := factor(name, levels = target)]
. Alors voyez les deuxdata.table
réponses iciNous pouvons ajuster les niveaux de facteur en fonction
target
et l'utiliser dansarrange
Ou
order
et utilisez-le dansslice
la source
Si vous ne souhaitez utiliser aucune bibliothèque et que vos données se reproduisent, vous pouvez également utiliser
which
avecsapply
.la source