Programowo (np. sapply(..., class))Lub interaktywnie (np. str(...)) Czy w obu przypadkach? Generalnie bardziej skalowalne jest zrobienie tego programowo, wtedy możesz dowolnie Filter(...)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
smci
@smci: Nie prosiłem o „programowo” w moim pierwotnym pytaniu. Nie wiem, dlaczego miałbyś zmienić całą naturę mojego pytania.
stackoverflowuser2010
ok, został wycofany. Nie zmieniło to całej natury, wyjaśniło ją w jednym z dwóch kierunków. Interaktywne podejścia wykorzystujące str(...)nie są skalowalne i wyczerpują się na <100 kolumnach.
smci
Odpowiedzi:
215
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.031.599-0.8180.872-2.682$ x1: int 12345$ x2: logi TRUETRUEFALSEFALSEFALSE$ X3: Factor w/5 levels "a","b","c","d",..:12345
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"
Po kilku miesiącach używania języka R stwierdziłem, że 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.
stackoverflowuser2010
Cześć, kiedy zrobiłem to samo z aplikowaniem zamiast aplikować, to nie zadziałało
Dom Jo
@DomJo, dlaczego miałbyś używać apply()? To dotyczy matryc. Ramka danych jest listą (specjalnego rodzaju).
gung - Przywróć Monikę
50
sapply(yourdataframe, class)
Gdzie twoja ramka danych to nazwa ramki danych, której używasz
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.
# 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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141
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):
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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141421.462581103.083.2219.41031
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]).
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/grepl
do wywnioskowania typów kolumn na podstawie,names(...)
jeśli są zgodne z jakąś konwencją nazewnictwastr(...)
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:Rozwiązanie @Wilmer E Henao H jest bardzo usprawnione:
Użycie zapewnia
str()
te informacje oraz dodatkowe korzyści (takie jak poziomy współczynników i kilka pierwszych wartości każdej zmiennej):Podejście @Gavina Simpsona jest również usprawnione, ale dostarcza nieco innych informacji niż
class()
:Aby uzyskać więcej informacji na temat
class
,typeof
i środkowego dziecka,mode
zobacz ten doskonały wątek SO: Kompleksowy przegląd typów rzeczy w „trybie” R, „klasie” i „typie” jest niewystarczający .źródło
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).Gdzie twoja ramka danych to nazwa ramki danych, której używasz
źródło
sugerowałbym
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
foo
zostanie zastąpiona nazwą ramki danych.źródło
Po prostu przekaż ramkę danych do następującej funkcji:
aby stworzyć wykres wszystkich typów danych w ramce danych. Dla zbioru danych tęczówki otrzymujemy:
źródło
W przypadku małych ramek danych:
daje wydruk pliku df z typami danych
W przypadku dużych ramek danych:
zapewnia uporządkowany widok typów danych:
Aby uzyskać listę typów danych kolumn (jak powiedział @Alexandre powyżej):
podaje listę typów danych:
Aby zmienić typ danych w kolumnie:
konwertuje kolumny
mpg
iam
na znak, a kolumnęcarb
na liczbę całkowitą:źródło
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.frame
dwie kolumny liczbowe i jedną logicznąZa pomocą tego można podsumować liczbę kolumn każdego typu danych
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 .
źródło
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.
Możesz wtedy zrobić coś takiego
var(my.data[t$numeric])
.Mam nadzieję, że to jest pomocne!
źródło
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
źródło
Inną opcją jest użycie funkcji map pakietu purrr.
źródło