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?

Kyle Brandt
fonte

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
Kyle Brandt
fonte
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.

Rohit Saini
fonte
1

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

unlist(lapply(mtcars,class))
Seyma Kalay
fonte
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)
AlexB
fonte
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"
Alec
fonte
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