Tôi đang sử dụng R và đã tải dữ liệu vào một khung dữ liệu bằng cách sử dụng read.csv()
. Làm cách nào để xác định loại dữ liệu của từng cột trong khung dữ liệu?
str(...)
không thể mở rộng và hết hơi trên <100 cols.
Tôi đang sử dụng R và đã tải dữ liệu vào một khung dữ liệu bằng cách sử dụng read.csv()
. Làm cách nào để xác định loại dữ liệu của từng cột trong khung dữ liệu?
str(...)
không thể mở rộng và hết hơi trên <100 cols.
Câu trả lời:
Đặt cược tốt nhất của bạn để bắt đầu là sử dụng ?str()
. Để khám phá một số ví dụ, hãy tạo một số dữ liệu:
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 Giải pháp của Henao H rất hợp lý:
sapply(my.data, class)
y x1 x2 X3
"numeric" "integer" "logical" "factor"
Việc sử dụng mang lại cho str()
bạn thông tin đó cộng với các tính năng bổ sung (chẳng hạn như mức độ các yếu tố của bạn và một vài giá trị đầu tiên của mỗi biến):
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
Cách tiếp cận của @Gavin Simpson cũng được sắp xếp hợp lý, nhưng cung cấp thông tin hơi khác so với class()
:
sapply(my.data, typeof)
y x1 x2 X3
"double" "integer" "logical" "integer"
Để biết thêm thông tin về class
, typeof
và đứa con giữa mode
, hãy xem chủ đề SO xuất sắc này: Một khảo sát toàn diện về các loại sự vật trong chế độ R. 'và' lớp 'và' typeof 'là không đủ .
str(dataframe)
là cách nhanh nhất để xác định các loại cột trong nháy mắt. Các cách tiếp cận khác yêu cầu nhiều lần nhấn phím hơn và không hiển thị nhiều thông tin, nhưng chúng rất hữu ích nếu các kiểu dữ liệu cột là đầu vào cho các chức năng khác.
apply()
? Đó là cho ma trận. Khung dữ liệu là một danh sách (loại đặc biệt).
sapply(yourdataframe, class)
Yourdataframe là tên của khung dữ liệu bạn đang sử dụng
Tôi sẽ đề nghị
sapply(foo, typeof)
nếu bạn cần các loại vectơ thực tế trong khung dữ liệu. class()
là một phần của một con thú khác nhau.
Nếu bạn không cần phải lấy thông tin này dưới dạng vectơ (tức là bạn không cần nó để làm một cái gì đó khác theo chương trình sau này), chỉ cần sử dụng str(foo)
.
Trong cả hai trường hợp foo
sẽ được thay thế bằng tên của khung dữ liệu của bạn.
Chỉ cần chuyển khung dữ liệu của bạn vào chức năng sau:
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")
}
để tạo một biểu đồ của tất cả các loại dữ liệu trong khung dữ liệu của bạn. Đối với tập dữ liệu iris, chúng tôi nhận được như sau:
data_types(iris)
Đối với khung dữ liệu nhỏ:
library(tidyverse)
as_tibble(mtcars)
cung cấp cho bạn một bản in ra khỏi df với các loại dữ liệu
# 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
Đối với khung dữ liệu lớn:
glimpse(mtcars)
cung cấp cho bạn chế độ xem cấu trúc của các loại dữ liệu:
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, ...
Để có danh sách loại dữ liệu của các cột (như đã nói bởi @Alexandre ở trên):
map(mtcars, class)
đưa ra một danh sách các loại dữ liệu:
$mpg
[1] "numeric"
$cyl
[1] "numeric"
$disp
[1] "numeric"
$hp
[1] "numeric"
Để thay đổi kiểu dữ liệu của một cột:
library(hablar)
mtcars %>%
convert(chr(mpg, am),
int(carb))
chuyển đổi các cột mpg
và am
thành ký tự và cột carb
thành số nguyên:
# 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
Vì nó không được nêu rõ ràng, tôi chỉ cần thêm điều này:
Tôi đang tìm cách tạo một bảng chứa số lần xuất hiện của tất cả các kiểu dữ liệu .
Giả sử chúng ta có một data.frame
cột có hai số và một cột logic
dta <- data.frame(a = c(1,2,3),
b = c(4,5,6),
c = c(TRUE, FALSE, TRUE))
Bạn có thể tóm tắt số lượng cột của từng loại dữ liệu với
table(unlist(lapply(dta, class)))
# logical numeric
# 1 2
Điều này rất tiện dụng, nếu bạn có nhiều cột và muốn có một cái nhìn tổng quan nhanh chóng.
Để cung cấp tín dụng: Giải pháp này được lấy cảm hứng từ câu trả lời của @Cyber từ .
Đây là một hàm là một phần của gói helpRFifts sẽ trả về một danh sách tất cả các loại dữ liệu khác nhau trong khung dữ liệu của bạn, cũng như các tên biến cụ thể được liên kết với loại đó.
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
Sau đó bạn có thể làm một cái gì đó như var(my.data[t$numeric])
.
Hy vọng điều này là hữu ích!
lapply(your_data, class)
với một chút xử lý bổ sung để định dạng.
Nếu bạn nhập tệp csv dưới dạng data.frame (chứ không phải ma trận), bạn cũng có thể sử dụng 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
Một tùy chọn khác là sử dụng chức năng bản đồ của gói purrr.
library(purrr)
map(df,class)
sapply(..., class))
hoặc tương tác (ví dụstr(...)
) hoặc cả hai? Nói chung có thể mở rộng hơn để lập trình, sau đó bạn có thể tùy ýFilter(...)
danh sách các số nguyên, ký tự, yếu tố, v.v. Hoặc bạn có thể sử dụnggrep/grepl
để suy ra các kiểu cột từnames(...)
nếu chúng tuân theo bất kỳ quy ước đặt tên nào