Bestimmen Sie die Datentypen der Spalten eines Datenrahmens


152

Ich benutze R und habe mit Daten in einen Datenrahmen geladen read.csv(). Wie bestimme ich den Datentyp jeder Spalte im Datenrahmen?


Programmatisch (z. B. sapply(..., class))oder interaktiv (z. B. str(...)) oder beides? Es ist im Allgemeinen skalierbarer, dies programmgesteuert zu tun. Dann können Sie Filter(...)die Liste für Ganzzahlen, Zeichen, Faktoren usw. beliebig erstellen. Oder Sie können daraus Spaltentypen grep/greplableiten, names(...)wenn sie Namenskonventionen folgen
smci

@smci: Ich habe in meiner ursprünglichen Frage nicht nach 'programmatisch' gefragt. Ich weiß nicht, warum Sie die gesamte Art meiner Frage ändern würden.
stackoverflowuser2010

ok, es wurde zurückgerollt. Es hat nicht die ganze Natur verändert, es hat es in eine von zwei Richtungen geklärt. Interaktive Ansätze str(...)sind nicht skalierbar und haben bei <100 Spalten keinen Dampf mehr.
smci

Antworten:


213

Am besten starten Sie mit ?str(). Um einige Beispiele zu untersuchen, machen wir einige Daten:

set.seed(3221)  # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5), 
                      x1=c(1:5), 
                      x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                      X3=letters[1:5])

Die Lösung von @Wilmer E Henao H ist sehr rationalisiert:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

Wenn str()Sie verwenden, erhalten Sie diese Informationen sowie zusätzliche Extras (z. B. die Ebenen Ihrer Faktoren und die ersten Werte jeder Variablen):

str(my.data)
'data.frame':  5 obs. of  4 variables:
$ y : num  1.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

Der Ansatz von @Gavin Simpson ist ebenfalls optimiert, bietet jedoch etwas andere Informationen als class():

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

Für weitere Informationen über class, typeofund das mittleren Kind, modesehen, diesen ausgezeichneten SO thread: Eine umfassende Übersicht über die Arten von Dingen in R. ‚Mode‘ und ‚Klasse‘ und ‚typeof‘ unzureichend ist .


1
Nachdem ich R einige Monate lang verwendet habe, habe ich festgestellt, dass dies str(dataframe)der schnellste Weg ist, um die Spaltentypen auf einen Blick zu bestimmen. Die anderen Ansätze erfordern mehr Tastenanschläge und zeigen nicht so viele Informationen an. Sie sind jedoch hilfreich, wenn die Spaltendatentypen eine Eingabe für andere Funktionen sind.
stackoverflowuser2010

Hallo, als ich das gleiche mit bewerben statt bewerben tat, hat es nicht funktioniert
Dom Jo

@ DomJo, warum würdest du verwenden apply()? Das ist für Matrizen. Ein Datenrahmen ist eine (spezielle) Liste.
gung - Monica

50
sapply(yourdataframe, class)

Wobei Ihr Datenrahmen der Name des von Ihnen verwendeten Datenrahmens ist


18

ich würde vorschlagen

sapply(foo, typeof)

wenn Sie die tatsächlichen Typen der Vektoren im Datenrahmen benötigen. class()ist etwas von einem anderen Tier.

Wenn Sie diese Informationen nicht als Vektor abrufen müssen (dh wenn Sie sie später nicht programmgesteuert ausführen müssen), verwenden Sie einfach str(foo).

In beiden Fällen foowürde durch den Namen Ihres Datenrahmens ersetzt.


7

Übergeben Sie einfach Ihren Datenrahmen in die folgende Funktion:

data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

um ein Diagramm aller Datentypen in Ihrem Datenrahmen zu erstellen. Für den Iris- Datensatz erhalten wir Folgendes:

data_types(iris)

Geben Sie hier die Bildbeschreibung ein


5

Für kleine Datenrahmen:

library(tidyverse)

as_tibble(mtcars)

gibt Ihnen einen Ausdruck des df mit Datentypen

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

Für große Datenrahmen:

glimpse(mtcars)

gibt Ihnen eine strukturierte Ansicht der Datentypen:

Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...

So erhalten Sie eine Liste des Datentyps der Spalten (wie oben von @Alexandre angegeben):

map(mtcars, class)

gibt eine Liste der Datentypen:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

So ändern Sie den Datentyp einer Spalte:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

konvertiert Spalten mpgund amin Zeichen und die Spalte carbin Ganzzahl:

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1

3

Da es nicht klar angegeben wurde, füge ich einfach Folgendes hinzu:

Ich suchte nach einer Möglichkeit, eine Tabelle zu erstellen , die die Anzahl der Vorkommen aller Datentypen enthält .

Angenommen, wir haben eine data.framemit zwei numerischen und einer logischen Spalte

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

Damit können Sie die Anzahl der Spalten jedes Datentyps zusammenfassen

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

Dies ist äußerst praktisch, wenn Sie viele Spalten haben und sich einen schnellen Überblick verschaffen möchten.

Um Anerkennung zu geben: Diese Lösung wurde von der Antwort von @Cybernetic inspiriert .


2

Hier ist eine Funktion, die Teil des helpRFunctions- Pakets ist und eine Liste aller verschiedenen Datentypen in Ihrem Datenrahmen sowie die spezifischen Variablennamen zurückgibt , die diesem Typ zugeordnet sind.

install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5), 
                  x1=c(1:5), 
                  x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                  X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric

Sie könnten dann so etwas tun var(my.data[t$numeric]).

Hoffe das ist hilfreich!


1
Es ist erwähnenswert, dass dies unter der Haube lapply(your_data, class)mit etwas zusätzlicher Verarbeitung für die Formatierung verbunden ist.
Gregor Thomas

1

Wenn Sie die CSV-Datei als data.frame (und nicht als Matrix) importieren, können Sie sie auch verwenden summary.default

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric

1

Eine weitere Option ist die Verwendung der Map-Funktion des Purrr-Pakets.

library(purrr)
map(df,class)
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.