Używam języka R i załadowałem dane do ramki danych przy użyciu read.csv(). Jak określić typ danych każdej kolumny w ramce danych?
str(...)nie są skalowalne i wyczerpują się na <100 kolumnach.
Używam języka R i załadowałem dane do ramki danych przy użyciu read.csv(). Jak określić typ danych każdej kolumny w ramce danych?
str(...)nie są skalowalne i wyczerpują się na <100 kolumnach.
Odpowiedzi:
Najlepiej zacząć od użycia ?str(). Aby zbadać kilka przykładów, zróbmy trochę danych:
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])
Rozwiązanie @Wilmer E Henao H jest bardzo usprawnione:
sapply(my.data, class)
y x1 x2 X3
"numeric" "integer" "logical" "factor"
Użycie zapewnia str()te informacje oraz dodatkowe korzyści (takie jak poziomy współczynników i kilka pierwszych wartości każdej zmiennej):
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
Podejście @Gavina Simpsona jest również usprawnione, ale dostarcza nieco innych informacji niż class():
sapply(my.data, typeof)
y x1 x2 X3
"double" "integer" "logical" "integer"
Aby uzyskać więcej informacji na temat class, typeofi środkowego dziecka, modezobacz ten doskonały wątek SO: Kompleksowy przegląd typów rzeczy w „trybie” R, „klasie” i „typie” jest niewystarczający .
str(dataframe)jest to najszybszy sposób na szybkie określenie typów kolumn. Inne podejścia wymagają więcej naciśnięć klawiszy i nie pokazują tak wielu informacji, ale są przydatne, jeśli typy danych kolumn są danymi wejściowymi dla innych funkcji.
apply()? To dotyczy matryc. Ramka danych jest listą (specjalnego rodzaju).
sapply(yourdataframe, class)
Gdzie twoja ramka danych to nazwa ramki danych, której używasz
sugerowałbym
sapply(foo, typeof)
jeśli potrzebujesz rzeczywistych typów wektorów w ramce danych. class()jest czymś w rodzaju innej bestii.
Jeśli nie potrzebujesz uzyskać tej informacji jako wektor (tj. Nie potrzebujesz jej do zrobienia czegoś innego programistycznie później), po prostu użyj str(foo).
W obu przypadkach foozostanie zastąpiona nazwą ramki danych.
Po prostu przekaż ramkę danych do następującej funkcji:
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")
}
aby stworzyć wykres wszystkich typów danych w ramce danych. Dla zbioru danych tęczówki otrzymujemy:
data_types(iris)
W przypadku małych ramek danych:
library(tidyverse)
as_tibble(mtcars)
daje wydruk pliku df z typami danych
# 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
W przypadku dużych ramek danych:
glimpse(mtcars)
zapewnia uporządkowany widok typów danych:
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, ...
Aby uzyskać listę typów danych kolumn (jak powiedział @Alexandre powyżej):
map(mtcars, class)
podaje listę typów danych:
$mpg
[1] "numeric"
$cyl
[1] "numeric"
$disp
[1] "numeric"
$hp
[1] "numeric"
Aby zmienić typ danych w kolumnie:
library(hablar)
mtcars %>%
convert(chr(mpg, am),
int(carb))
konwertuje kolumny mpgi amna znak, a kolumnę carbna liczbę całkowitą:
# 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
Ponieważ nie zostało to jasno określone, po prostu dodaję:
Szukałem sposobu na utworzenie tabeli zawierającej liczbę wystąpień wszystkich typów danych .
Powiedzmy, że mamy data.framedwie kolumny liczbowe i jedną logiczną
dta <- data.frame(a = c(1,2,3),
b = c(4,5,6),
c = c(TRUE, FALSE, TRUE))
Za pomocą tego można podsumować liczbę kolumn każdego typu danych
table(unlist(lapply(dta, class)))
# logical numeric
# 1 2
Jest to niezwykle przydatne, jeśli masz dużo kolumn i chcesz uzyskać szybki przegląd.
Dla uznania: To rozwiązanie zostało zainspirowane odpowiedzią @Cybernetic .
Oto funkcja, która jest częścią pakietu helpRFunctions , która zwraca listę wszystkich różnych typów danych w ramce danych, a także określone nazwy zmiennych skojarzonych z tym typem.
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
Możesz wtedy zrobić coś takiego var(my.data[t$numeric]).
Mam nadzieję, że to jest pomocne!
lapply(your_data, class)to trochę dodatkowe przetwarzanie dla formatowania.
Jeśli importujesz plik csv jako data.frame (a nie macierz), możesz również użyć 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
Inną opcją jest użycie funkcji map pakietu purrr.
library(purrr)
map(df,class)
sapply(..., class))Lub interaktywnie (np.str(...)) Czy w obu przypadkach? Generalnie bardziej skalowalne jest zrobienie tego programowo, wtedy możesz dowolnieFilter(...)wybrać listę liczb całkowitych, znaków, współczynników itp. Lub możesz użyćgrep/grepldo wywnioskowania typów kolumn na podstawie,names(...)jeśli są zgodne z jakąś konwencją nazewnictwa