it-swarm.com.de

Bestimmen Sie die Datentypen der Spalten eines Datenrahmens

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

109

Am besten verwenden Sie ?str() . Um einige Beispiele zu untersuchen, lassen Sie uns einige Daten erstellen: 

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 vereinfacht: 

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

Mit str() erhalten Sie diese Informationen und zusätzliche Goodies (wie die Stufen 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 rationalisiert, bietet jedoch etwas andere Informationen als class()

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

Weitere Informationen zu class, typeof und dem mittleren Kind mode finden Sie in diesem ausgezeichneten SO - Thread: Eine umfassende Übersicht über die Arten von Dingen in R. 'mode' und 'class' und 'typeof' unzureichend

165
gung
sapply(yourdataframe, class)

Dabei ist Ihr Datenrahmen der Name des von Ihnen verwendeten Datenrahmens

34
Wilmer E. Henao

Ich würde vorschlagen

sapply(foo, typeof)

wenn Sie die tatsächlichen Typen der Vektoren im Datenrahmen benötigen. class() ist so etwas anderes.

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

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

15
Gavin Simpson

Ü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 eine Darstellung aller Datentypen in Ihrem Datenrahmen zu erstellen. Für den iris -Datensatz erhalten wir Folgendes: 

data_types(iris)

 enter image description here

7
Cybernetic

Da es nicht eindeutig angegeben ist, füge ich nur folgendes hinzu: 

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

Angenommen, wir haben einen data.frame mit 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. 

Anerkennen: Diese Lösung wurde von der Antwort von @Cybernetic inspiriert. 

3
loki

Hier ist eine Funktion, die Teil des Pakets helpRFunctions ist, das eine Liste aller verschiedenen Datentypen in Ihrem Datenrahmen sowie die mit diesem Typ verknüpften Variablennamen zurückgibt. 

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 etwas wie var(my.data[t$numeric]) tun.

Hoffe das ist hilfreich!

2
ML_Dev

Für kleine Datenrahmen:

library(tidyverse)

as_tibble(mtcars)

gibt Ihnen einen Ausdruck des Datenträgers 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 Sicht auf 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, ...

Um eine Liste des Datentyps der Spalten zu erhalten (wie von @Alexandre oben 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))

wandelt die Spalten mpg und am in Zeichen und die Spalte carb in Ganzzahl um:

# 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
1
davsjob

Eine weitere Option ist die Verwendung der Kartenfunktion des Pakets purrr.

library(purrr)
map(df,class)
1
Alexandre Lima

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

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
0
DJV