Come ottengo le classi di tutte le colonne in un data frame?


85

Qual è un modo semplice per scoprire qual è la classe di ciascuna colonna in un data frame?

Risposte:


92

Un'opzione è usare lapplye class. Per esempio:

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

$SomeNumeric
[1] "numeric"

Un'altra opzione è str:

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

10
Poiché classrestituisce un vettore di caratteri di tutte le classi da cui un oggetto eredita, l'output di sapply(foo, class)potrebbe essere un elenco e non sempre un vettore di caratteri come la maggior parte delle persone si aspetterebbe. Che può essere un po 'pericoloso ... Trovo lapplymolto più sicuro.
flodel

1
per una migliore leggibilità suggerisco: unlist(lapply(foo, class))che è utile con frame di dati con molte colonne.
p130ter

1
unlistcon lapplyè un'idea terribile perché è possibile che length(class(x))>1 (vedi commenti sopra) - sapplysia molto più sicuro di unlist + lapply. un modo sicuro sarebbe sapply(lapply(foo, class), "[", 1)- dato che foo è un data frame
lebatsnok

28

È possibile utilizzare semplicemente lapplyo sapplyfunzioni incorporate.

lapplyti restituirà un list-

lapply(dataframe,class)

mentre sapplyaccetterà il miglior tipo di ritorno possibile ex. Vector ecc -

sapply(dataframe,class)

Entrambi i comandi ti restituiranno tutti i nomi delle colonne con la rispettiva classe.


1

Hello stava cercando lo stesso, e potrebbe anche essere

unlist(lapply(mtcars,class))

0

Puoi anche usare purrr, che è simile alle applyfunzioni familiari:

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

0

Volevo un output più compatto rispetto alle ottime risposte sopra usando lapply, quindi ecco un'alternativa racchiusa come una piccola funzione.

# 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"

Sei sicuro di volere che il tuo risultato sia una matrice a 1 colonna? Perché? Che ne dici di un vettore di caratteri invece?
nbenn

Certo, perché non restituire una matrice a 1 colonna? Ho affermato che questa soluzione è per un output compatto, utile per tornare a controllare dopo aver manipolato un data.frame, ad esempio. Non è pensato per essere utilizzato per l'elaborazione a valle delle classi di colonna. Le altre risposte sopra restituiscono un vettore di caratteri.
Alec
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.