Ich benutze R und habe mit Daten in einen Datenrahmen geladen read.csv()
. Wie bestimme ich den Datentyp jeder Spalte im Datenrahmen?
str(...)
sind nicht skalierbar und haben bei <100 Spalten keinen Dampf mehr.
Ich benutze R und habe mit Daten in einen Datenrahmen geladen read.csv()
. Wie bestimme ich den Datentyp jeder Spalte im Datenrahmen?
str(...)
sind nicht skalierbar und haben bei <100 Spalten keinen Dampf mehr.
Antworten:
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
, typeof
und das mittleren Kind, mode
sehen, diesen ausgezeichneten SO thread: Eine umfassende Übersicht über die Arten von Dingen in R. ‚Mode‘ und ‚Klasse‘ und ‚typeof‘ unzureichend ist .
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.
apply()
? Das ist für Matrizen. Ein Datenrahmen ist eine (spezielle) Liste.
sapply(yourdataframe, class)
Wobei Ihr Datenrahmen der Name des von Ihnen verwendeten Datenrahmens ist
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 foo
würde durch den Namen Ihres Datenrahmens ersetzt.
Ü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)
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 mpg
und am
in Zeichen und die Spalte carb
in 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
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.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.
Um Anerkennung zu geben: Diese Lösung wurde von der Antwort von @Cybernetic inspiriert .
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!
lapply(your_data, class)
mit etwas zusätzlicher Verarbeitung für die Formatierung verbunden ist.
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
Eine weitere Option ist die Verwendung der Map-Funktion des Purrr-Pakets.
library(purrr)
map(df,class)
sapply(..., class))
oder interaktiv (z. B.str(...)
) oder beides? Es ist im Allgemeinen skalierbarer, dies programmgesteuert zu tun. Dann können SieFilter(...)
die Liste für Ganzzahlen, Zeichen, Faktoren usw. beliebig erstellen. Oder Sie können daraus Spaltentypengrep/grepl
ableiten,names(...)
wenn sie Namenskonventionen folgen