Obrigado! mas eu tenho outro problema. Eu tenho o nome de cada coluna em uma matriz de caracteres col_names []. Como posso usar o comando acima (mydf $ col_names [i]) não funciona.
Rasoul
Existe alguma maneira de fazer isso automaticamente para todas as variáveis de caracteres, como data.frame faz com stringsAsFactors?
Etienne Low-Décarie
@ EtienneLow-Décarie: apenas unclasse use data.frameno resultado.
IRTFM 17/08/2013
Respostas:
197
Olá, seja bem-vindo ao mundo da R.
mtcars #look at this built in data set
str(mtcars)#allows you to see the classes of the variables (all numeric)#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)#another approach
mtcars[,'cyl']<- as.factor(mtcars[,'cyl'])
str(mtcars)# now look at the classes
Isso também funciona para caracteres, datas, números inteiros e outras classes
Como você é novo no R, sugiro que você dê uma olhada nesses dois sites:
Obrigado! mas eu tenho outro problema. Eu tenho o nome de cada coluna em uma matriz de caracteres col_names []. Como posso usar o comando acima (nem mydf$col_names[i]nem mydf[,col_names[i]]não funciona.)
Rasoul
1
@Rasoul, mydf[, col_names]fará isso #
DrDom 12/02/12
3
+1 para os árbitros. Isso é básico, o que é bom perguntar, mas também é bom estar ciente do extenso trabalho que foi colocado nesses trabalhos (e similares).
Roman Luštrik
84
# To do it for all names
df[]<- lapply( df, factor)# the "[]" keeps the dataframe structure
col_names <- names(df)# do do it for some names in a vector named 'col_names'
df[col_names]<- lapply(df[col_names], factor)
Explicação. Todos os quadros de dados são listas e os resultados [usados com vários argumentos com valor também são listas; portanto, fazer o loop sobre as listas é a tarefa lapply. A atribuição acima criará um conjunto de listas nas quais a função data.frame.[<-deve voltar com êxito ao quadro de dados,df
Outra estratégia seria converter apenas as colunas em que o número de itens exclusivos é menor que algum critério, digamos menos que o log do número de linhas como exemplo:
Esta é uma solução muito boa! Também pode funcionar com números de colunas que podem ser especialmente úteis se você quiser alterar muitos, mas não todos. Por exemplo, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57) e depois df [, col_nums] <- lapply (df [, col_nums] , fator).
WGray 8/08/14
Advertência: a primeira solução não funciona se length(col_names)==1. Nesse caso, df[,col_names]é automaticamente rebaixado para um vetor em vez de uma lista de comprimento 1 e, em seguida, lapplytenta operar sobre cada entrada em vez da coluna como um todo. Isso pode ser evitado usando df[,col_names,drop=FALSE].
P
Esse é um bom ponto. A outra invocação que manteria o status da lista é usar df[col_names].
IRTFM 11/09/16
27
Você pode usar dplyr::mutate_if()para converter todas as colunas de caracteres ou dplyr::mutate_at()selecionar colunas de caracteres nomeadas em fatores:
library(dplyr)# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)
Se você deseja alterar todas as variáveis de caractere no data.frame para fatores depois de já ter carregado os dados, é possível fazer assim, para um data.frame chamado dat:
A conversão completa de cada variável de caractere para fator geralmente ocorre ao ler dados, por exemplo, com stringsAsFactors = TRUE, mas isso é útil quando, por exemplo, você leu os dados read_excel()do readxlpacote e deseja treinar um modelo de floresta aleatório que não aceita variáveis de caracteres.
Sam Firke
13
Outra maneira curta que você pode usar é um pipe ( %<>%) do pacote magrittr . Ele converte a coluna de caracteres mycolumn em um fator.
Edite com mais informações. As respostas somente código e "tente isso" são desencorajadas, porque não contêm conteúdo pesquisável e não explicam por que alguém deveria "tentar fazer isso". Nós fazemos um esforço aqui para ser um recurso para o conhecimento.
Brian Tompsett -
pls se eu não quiser usá-lo para todas as colunas do meu df?
Mostafa
5
Eu estou fazendo isso com uma função. Neste caso, vou transformar apenas variáveis de caracteres em fator:
unclass
e usedata.frame
no resultado.Respostas:
Olá, seja bem-vindo ao mundo da R.
Isso também funciona para caracteres, datas, números inteiros e outras classes
Como você é novo no R, sugiro que você dê uma olhada nesses dois sites:
Manuais de referência R: http://cran.r-project.org/manuals.html
R Cartão de referência: http://cran.r-project.org/doc/contrib/Short-refcard.pdf
fonte
mydf$col_names[i]
nemmydf[,col_names[i]]
não funciona.)mydf[, col_names]
fará isso #Explicação. Todos os quadros de dados são listas e os resultados
[
usados com vários argumentos com valor também são listas; portanto, fazer o loop sobre as listas é a tarefalapply
. A atribuição acima criará um conjunto de listas nas quais a funçãodata.frame.[<-
deve voltar com êxito ao quadro de dados,df
Outra estratégia seria converter apenas as colunas em que o número de itens exclusivos é menor que algum critério, digamos menos que o log do número de linhas como exemplo:
fonte
length(col_names)==1
. Nesse caso,df[,col_names]
é automaticamente rebaixado para um vetor em vez de uma lista de comprimento 1 e, em seguida,lapply
tenta operar sobre cada entrada em vez da coluna como um todo. Isso pode ser evitado usandodf[,col_names,drop=FALSE]
.df[col_names]
.Você pode usar
dplyr::mutate_if()
para converter todas as colunas de caracteres oudplyr::mutate_at()
selecionar colunas de caracteres nomeadas em fatores:fonte
Se você deseja alterar todas as variáveis de caractere no data.frame para fatores depois de já ter carregado os dados, é possível fazer assim, para um data.frame chamado
dat
:Isso cria um vetor que identifica quais colunas são de classe
character
e depois se aplicaas.factor
a essas colunas.Dados de amostra:
fonte
stringsAsFactors = TRUE
, mas isso é útil quando, por exemplo, você leu os dadosread_excel()
doreadxl
pacote e deseja treinar um modelo de floresta aleatório que não aceita variáveis de caracteres.Outra maneira curta que você pode usar é um pipe (
%<>%
) do pacote magrittr . Ele converte a coluna de caracteres mycolumn em um fator.fonte
Eu estou fazendo isso com uma função. Neste caso, vou transformar apenas variáveis de caracteres em fator:
fonte
[[i]]