Como faço para obter as classes de todas as colunas em um quadro de dados?


85

Qual é uma maneira fácil de descobrir em que classe está cada coluna em um quadro de dados?

Respostas:


92

Uma opção é usar lapplye class. Por exemplo:

> foo <- data.frame(c("a", "b"), c(1, 2))
> names(foo) <- c("SomeFactor", "SomeNumeric")
> lapply(foo, class)
$SomeFactor
[1] "factor"

$SomeNumeric
[1] "numeric"

Outra opção é str:

> str(foo)
'data.frame':   2 obs. of  2 variables:
 $ SomeFactor : Factor w/ 2 levels "a","b": 1 2
 $ SomeNumeric: num  1 2

10
Visto que classretorna um vetor de caracteres de todas as classes das quais um objeto herda, a saída de sapply(foo, class)pode ser uma lista, e nem sempre um vetor de caracteres como a maioria das pessoas esperaria. O que pode ser um pouco perigoso ... acho lapplymuito mais seguro.
flodel

1
para melhor legibilidade, sugiro: o unlist(lapply(foo, class))que é útil com frames de dados com muitas colunas.
p130ter

1
unlistcom lapplyé uma ideia terrível porque é possível que length(class(x))>1 (veja os comentários acima) - sapplyé muito mais seguro do que unlist + lapply. uma maneira segura seria sapply(lapply(foo, class), "[", 1)- dado que foo é um quadro de dados
lebatsnok

28

Você pode usar funções simples lapplyou sapplyembutidas.

lapplyvai te devolver um list-

lapply(dataframe,class)

while sapplyterá o melhor tipo de retorno possível, ex. Vector etc -

sapply(dataframe,class)

Ambos os comandos retornarão todos os nomes das colunas com suas respectivas classes.


1

Hello estava procurando pelo mesmo, e poderia ser também

unlist(lapply(mtcars,class))

0

Você também pode usar purrr, que é semelhante às applyfunções familiares:

as.data.frame(purrr::map_chr(mtcars, class))
purrr::map_df(mtcars, class)

0

Eu queria uma saída mais compacta do que as ótimas respostas acima usando lapply, então aqui está uma alternativa embrulhada como uma pequena função.

# Example data
df <-
    data.frame(
        w = seq.int(10),
        x = LETTERS[seq.int(10)],
        y = factor(letters[seq.int(10)]),
        z = seq(
            as.POSIXct('2020-01-01'),
            as.POSIXct('2020-10-01'),
            length.out = 10
        )
    )

# Function returning compact column classes
col_classes <- function(df) {
    t(as.data.frame(lapply(df, function(x) paste(class(x), collapse = ','))))
}

# Return example data's column classes
col_classes(df)
  [,1]            
w "integer"       
x "character"     
y "factor"        
z "POSIXct,POSIXt"

Tem certeza de que deseja que seu resultado seja uma matriz de 1 coluna? Por quê? Que tal um vetor de caracteres?
nbenn

Claro, por que não retornar uma matriz de 1 coluna? Afirmei que esta solução é para uma saída compacta, útil para retornar para verificar depois de manipular um data.frame, por exemplo. Ele não deve ser usado para processamento downstream de classes de coluna. As outras respostas acima retornam um vetor de caracteres.
Alec
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.