¿Hay una manera más fácil de garantizar que las filas de un marco de datos se ordenen de acuerdo con un vector "objetivo" como el que implementé en el breve ejemplo a continuación?
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")
Esto de alguna manera parece ser demasiado "complicado" para hacer el trabajo:
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. Lo intentématchpero no funciona bien.match(). Lo que viene a la mente esduplicated(),unique()o alguna otra rutina personalizada que "mantiene" los elementos deseados mientras desecha los demás. 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)))),]Yo prefiero usar
***_joinendplyrcada vez que necesito para que coincida con los datos. Un posible intento para estoTenga en cuenta que la entrada para
***_joinrequiere tbls o data.framefuente
dplyrson realmente agradables. Termine usándolos mucho por ahora tambiéntarget <- tibble(name = c("b", "c", "a", "d"))df %>% right_join(tibble(name = target), by = "name")Este método es un poco diferente, me proporcionó un poco más de flexibilidad que la respuesta anterior. Al convertirlo en un factor ordenado, puede usarlo bien
arrangey tal. Usé reorder.factor delgdatapaquete.Luego, use el hecho de que ahora está ordenado:
Si desea volver al orden original (alfabético), solo use
as.character()para volver al estado original.fuente
setDT(df)[ , name := factor(name, levels = target)]. Entonces vea las dosdata.tablerespuestas aquíPodemos ajustar los niveles de factores basados en
targety usarlo enarrangeO
orderúsalo y úsalo enslicefuente
Si no desea usar ninguna biblioteca y tiene recurrencias en sus datos, también puede usar
whichconsapply.fuente