¿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ématch
pero 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
***_join
endplyr
cada vez que necesito para que coincida con los datos. Un posible intento para estoTenga en cuenta que la entrada para
***_join
requiere tbls o data.framefuente
dplyr
son 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
arrange
y tal. Usé reorder.factor delgdata
paquete.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.table
respuestas aquíPodemos ajustar los niveles de factores basados en
target
y usarlo enarrange
O
order
úsalo y úsalo enslice
fuente
Si no desea usar ninguna biblioteca y tiene recurrencias en sus datos, también puede usar
which
consapply
.fuente