Eu tenho um quadro de dados com algumas variáveis numéricas e algumas factor
variáveis categóricas . A ordem dos níveis para esses fatores não é como eu quero que eles sejam.
numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
Se eu mudar a ordem dos níveis, as letras não estarão mais com seus números correspondentes (meus dados são totalmente absurdos a partir deste ponto).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Eu simplesmente quero alterar a ordem dos níveis , portanto, ao plotar, as barras são mostradas na ordem desejada - o que pode diferir da ordem alfabética padrão.
Respostas:
Use o
levels
argumento defactor
:fonte
um pouco mais, só para constar
Você também pode achar útil Relevel e combine_factor .
fonte
reorder(df$letters, seq(4,1))
Desde que essa pergunta foi ativada pela última vez, Hadley lançou seu novo
forcats
pacote para manipulação de fatores e estou achando isso extremamente útil. Exemplos do quadro de dados do OP:Para reverter níveis:
Para adicionar mais níveis:
E muitas outras
fct_xxx()
funções úteis .fonte
df %>% mutate(letters = fct_rev(letters))
.portanto, o que você deseja, no léxico R, é alterar apenas os rótulos de uma determinada variável de fator (ou seja, deixar os dados e os níveis de fator inalterados).
considerando que você deseja alterar apenas o mapeamento de ponto de dados para rótulo e não os dados ou o esquema de fatores (como os pontos de dados são agrupados em posições individuais ou valores de fatores, pode ser útil saber como o mapeamento é originalmente definido quando você cria inicialmente o fator.
as regras são simples:
fonte
Lidar com fatores em R é um trabalho bastante peculiar, devo admitir ... Ao reordenar os níveis dos fatores, você não está reordenando os valores numéricos subjacentes. Aqui está uma pequena demonstração:
Agora, se você converter esse fator para numérico, obterá:
Como você pode ver ... alterando os níveis, você altera apenas os níveis (quem diria, hein?), Não os valores numéricos! Mas, quando você usa a
factor
função como sugerido por Jonathan Chang, algo diferente acontece: você mesmo altera os valores numéricos.Você está recebendo erro mais uma vez, porque o faz
levels
e, em seguida, tente identificá-lofactor
. Não faça !!! Você não usarlevels
ou você vai bagunçar as coisas (a menos que você saiba exatamente o que está fazendo).Uma sugestão: evite nomear seus objetos com um nome idêntico aos objetos de R (
df
é a função de densidade da distribuição F,letters
fornece letras minúsculas do alfabeto). Nesse caso em particular, seu código não seria defeituoso, mas às vezes pode ser ... mas isso pode criar confusão, e nós não queremos isso, queremos?!? =)Em vez disso, use algo assim (voltarei desde o início mais uma vez):
Observe que você também pode nomear você
data.frame
comdf
e emletters
vez deg
, e o resultado será OK. Na verdade, esse código é idêntico ao que você postou, apenas os nomes são alterados. Esta partefactor(dtf$letter, levels = letters[4:1])
não geraria um erro, mas pode ser confusa!Leia o
?factor
manual completamente! Qual é a diferença entrefactor(g, levels = letters[4:1])
efactor(g, labels = letters[4:1])
? O que há de semelhante emlevels(g) <- letters[4:1]
eg <- factor(g, labels = letters[4:1])
?Você pode colocar a sintaxe do ggplot, para que possamos ajudá-lo mais nesta questão!
Felicidades!!!
Editar:
ggplot2
realmente requer a alteração de níveis e valores? Hm ... eu vou desenterrar este ...fonte
Gostaria de acrescentar outro caso em que os níveis poderiam ser cadeias carregando números junto com alguns caracteres especiais: como exemplo abaixo
Os níveis padrão de
x
é:Aqui, se quisermos reordenar os níveis dos fatores de acordo com o valor numérico, sem escrever explicitamente os níveis, o que poderíamos fazer é
Espero que isso possa ser considerado uma informação útil para futuros leitores.
fonte
Aqui está minha função para reordenar fatores de um determinado quadro de dados:
Uso:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
fonte