Wie erhalte ich die Klassen aller Spalten in einem Datenrahmen?

85

Was ist ein einfacher Weg, um herauszufinden, welche Klasse jede Spalte in einem Datenrahmen ist?

Kyle Brandt
quelle

Antworten:

91

Eine Option ist die Verwendung von lapplyund class. Zum Beispiel:

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

$SomeNumeric
[1] "numeric"

Eine weitere Option ist 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
quelle
20
Alsosapply(foo, class)
MYaseen208
10
Da classein Zeichenvektor aller Klassen zurückgegeben wird, von denen ein Objekt erbt, ist die Ausgabe von sapply(foo, class)möglicherweise eine Liste und nicht immer ein Zeichenvektor, wie die meisten Leute erwarten würden. Was ein bisschen gefährlich sein kann ... Ich finde es lapplyviel sicherer.
Flodel
1
Zur besseren Lesbarkeit schlage ich vor: Das unlist(lapply(foo, class))ist praktisch bei Datenrahmen mit vielen Spalten.
p130ter
1
unlistmit lapplyist eine schreckliche Idee, weil es möglich ist, dass length(class(x))>1 (siehe Kommentare oben) - sapplyviel sicherer ist als unlist + lapply. Ein sicherer Weg wäresapply(lapply(foo, class), "[", 1)
vorausgesetzt
27

Sie können einfach Funktionen verwenden lapplyoder sapplyeinbauen.

lapplywird Ihnen ein list- zurückgeben

lapply(dataframe,class)

while sapplywird den bestmöglichen Rückgabetyp ex nehmen. Vektor etc -

sapply(dataframe,class)

Beide Befehle geben Ihnen alle Spaltennamen mit ihrer jeweiligen Klasse zurück.

Rohit Saini
quelle
1

Hallo suchte das gleiche, und es könnte auch sein

unlist(lapply(mtcars,class))
Seyma Kalay
quelle
0

Sie können auch Folgendes verwenden purrr, das applyFamilienfunktionen ähnelt :

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

Ich wollte eine kompaktere Ausgabe als die oben genannten großartigen Antworten. lapplyHier ist eine Alternative, die als kleine Funktion verpackt ist.

# 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
quelle
Sind Sie sicher, dass Ihr Ergebnis eine 1-Spalten-Matrix sein soll? Warum? Wie wäre es stattdessen mit einem Zeichenvektor?
4.
Sicher, warum nicht eine 1-Spalten-Matrix zurückgeben? Ich habe angegeben, dass diese Lösung für eine kompakte Ausgabe gedacht ist, die nützlich ist, um nach der Bearbeitung eines data.frame zum Überprüfen zurückzukehren. Es ist nicht für die Weiterverarbeitung von Spaltenklassen vorgesehen. Die anderen obigen Antworten geben einen Zeichenvektor zurück.
Alec