Existe uma maneira mais fácil de garantir que as linhas de um quadro de dados sejam ordenadas de acordo com um vetor "alvo" como o que eu implementei no pequeno exemplo abaixo?
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")
De alguma forma, isso parece um pouco "complicado" demais para fazer o trabalho:
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
. Eu tentei,match
mas não funciona bem.match()
. O que vem à mente éduplicated()
,unique()
ou alguma outra rotina personalizada que "mantém" os elementos desejados enquanto joga fora os outros. 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)))),]
Eu prefiro usar
***_join
emdplyr
sempre que eu preciso para combinar dados. Uma tentativa possível para issoObserve que a entrada para
***_join
requer tbls ou data.framefonte
dplyr
são muito legais. Acabam usando estes muito por agora, bemtarget <- tibble(name = c("b", "c", "a", "d"))
df %>% right_join(tibble(name = target), by = "name")
Esse método é um pouco diferente, me proporcionou um pouco mais de flexibilidade do que a resposta anterior. Ao transformá-lo em um fator ordenado, você pode usá-lo perfeitamente
arrange
. Eu usei reorder.factor dogdata
pacote.Em seguida, use o fato de que agora está ordenado:
Se você quiser voltar à ordem original (alfabética), use-a
as.character()
para voltar ao estado original.fonte
setDT(df)[ , name := factor(name, levels = target)]
. Então veja as duasdata.table
respostas aquiPodemos ajustar os níveis dos fatores com base
target
e usá-los emarrange
Ou
order
use-o emslice
fonte
Se você não quiser usar qualquer bibliotecas e você tem reoccurrences em seus dados, você pode usar
which
com osapply
bem.fonte