Я використовую R і завантажую дані в рамку даних за допомогою read.csv(). Як визначити тип даних кожного стовпця в кадрі даних?
str(...)не є масштабованим і не вистачає пари на <100 cols.
Я використовую R і завантажую дані в рамку даних за допомогою read.csv(). Як визначити тип даних кожного стовпця в кадрі даних?
str(...)не є масштабованим і не вистачає пари на <100 cols.
Відповіді:
Найкраще почати це використовувати ?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» недостатньо .
str(dataframe)це найшвидший спосіб визначити типи стовпців з першого погляду. Інші підходи вимагають більше натискань клавіш і не показують стільки інформації, але вони корисні, якщо типи даних стовпців є входом до інших функцій.
apply()? Це для матриць. Кадр - це перелік (особливий вид).
sapply(yourdataframe, class)
Там, де yourdataframe - назва кадру даних, який ви використовуєте
Я б запропонував
sapply(foo, typeof)
якщо вам потрібні фактичні типи векторів у кадрі даних. class()дещо інший звір.
Якщо вам не потрібно отримувати цю інформацію як вектор (тобто вам не потрібно, щоб пізніше робити щось інше програмно), просто використовуйте str(foo).
В обох випадках fooбуло б замінено назвою вашого кадру даних.
Просто переведіть ваш кадр даних у наступну функцію:
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)
Для невеликих кадрів даних:
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
Оскільки це не було чітко зазначено, я просто додаю це:
Я шукав спосіб створити таблицю, яка містить кількість входів усіх типів даних .
Скажімо, у нас є 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 .
Ось функція, яка є частиною пакету 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]).
Сподіваюся, це корисно!
lapply(your_data, class)трохи додаткової обробки для форматування.
Якщо ви імпортуєте файл 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
Інший варіант - використання функції карти пакету purrr.
library(purrr)
map(df,class)
sapply(..., class))інтерактивно (наприкладstr(...)) або обидва)? Це взагалі більш масштабовано робити це програмно, тоді ви можете довільно скластиFilter(...)список цілих чисел, символів, факторів тощо. Або ви можете використовуватиgrep/greplдля виведення типів стовпців,names(...)якщо вони дотримуються будь-яких умов іменування