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?

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

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.


1

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

unlist(lapply(mtcars,class))

0

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

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

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"

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.