Визначте типи даних стовпців кадру даних


153

Я використовую R і завантажую дані в рамку даних за допомогою read.csv(). Як визначити тип даних кожного стовпця в кадрі даних?


Програмно (наприклад, sapply(..., class))інтерактивно (наприклад str(...)) або обидва)? Це взагалі більш масштабовано робити це програмно, тоді ви можете довільно скласти Filter(...)список цілих чисел, символів, факторів тощо. Або ви можете використовувати grep/greplдля виведення типів стовпців, names(...)якщо вони дотримуються будь-яких умов іменування
smci

@smci: У своєму початковому запитанні я не запитував "програмно". Я не знаю, чому ви змінили всю суть мого питання.
stackoverflowuser2010

гаразд, це було відкатано. Це не змінило всієї природи, прояснило її в одному з двох напрямків. Використання інтерактивних підходів str(...)не є масштабованим і не вистачає пари на <100 cols.
smci

Відповіді:


215

Найкраще почати це використовувати ?str(). Щоб вивчити деякі приклади, давайте наведемо деякі дані:

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])

@Wilmer E рішення Хенао Н дуже впорядковано:

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

Використовуючи, str()ви отримуєте цю інформацію плюс додаткові смаколики (наприклад, рівень ваших факторів та перші кілька значень кожної змінної):

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

Підхід @Gavin Simpson також є оптимізованим, але надає трохи іншу інформацію, ніж class():

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

Для отримання додаткової інформації про class, typeofі середнього дитини, modeсм цій прекрасній SO нитка: Всебічне дослідження типів речей в «режимі» Р. «клас» і «TYPEOF» недостатньо .


1
Після використання R протягом декількох місяців я виявив, що str(dataframe)це найшвидший спосіб визначити типи стовпців з першого погляду. Інші підходи вимагають більше натискань клавіш і не показують стільки інформації, але вони корисні, якщо типи даних стовпців є входом до інших функцій.
stackoverflowuser2010

Привіт, коли я зробив те ж саме із застосуванням, а не застосувати, це не спрацювало
Dom Jo

@DomJo, для чого б ти використовував apply()? Це для матриць. Кадр - це перелік (особливий вид).
gung - Відновіть Моніку


18

Я б запропонував

sapply(foo, typeof)

якщо вам потрібні фактичні типи векторів у кадрі даних. class()дещо інший звір.

Якщо вам не потрібно отримувати цю інформацію як вектор (тобто вам не потрібно, щоб пізніше робити щось інше програмно), просто використовуйте str(foo).

В обох випадках fooбуло б замінено назвою вашого кадру даних.


7

Просто переведіть ваш кадр даних у наступну функцію:

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")
}

створити графік усіх типів даних у вашому кадрі даних. Для набору даних райдужної оболонки ми отримуємо наступне:

data_types(iris)

введіть тут опис зображення


5

Для невеликих кадрів даних:

library(tidyverse)

as_tibble(mtcars)

надає друк із формату df з типами даних

# 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

Для великих кадрів даних:

glimpse(mtcars)

дає структурований вигляд типів даних:

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, ...

Щоб отримати список типів даних стовпців (як сказано в @Alexandre вище):

map(mtcars, class)

надає перелік типів даних:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

Щоб змінити тип даних стовпця:

library(hablar)

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

перетворює стовпці mpgі amсимволи, а стовпець carbу ціле число:

# 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

Оскільки це не було чітко зазначено, я просто додаю це:

Я шукав спосіб створити таблицю, яка містить кількість входів усіх типів даних .

Скажімо, у нас є data.frameдва числовий і один логічний стовпець

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

Можна з цим узагальнити кількість стовпців кожного типу даних

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

Це дуже зручно, якщо у вас багато колонок і хочете отримати швидкий огляд.

Щоб дати кредит: Це рішення надихнуло відповідь @Cybernetic .


2

Ось функція, яка є частиною пакету helpRFunctions, який поверне список усіх різних типів даних у вашому кадрі даних, а також конкретні імена змінних, пов’язані з цим типом.

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

Тоді ви могли б зробити щось на кшталт var(my.data[t$numeric]).

Сподіваюся, це корисно!


1
Варто зазначити, що під капотом це lapply(your_data, class)трохи додаткової обробки для форматування.
Грегор Томас

1

Якщо ви імпортуєте файл csv як файл data.frame (а не матриця), ви також можете використовувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.