Xác định kiểu dữ liệu của các cột của khung dữ liệu


153

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?


Lập trình (ví dụ 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ụng grep/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
smci

@smci: Tôi không hỏi 'lập trình' trong câu hỏi ban đầu của mình. Tôi không biết tại sao bạn sẽ thay đổi toàn bộ bản chất câu hỏi của tôi.
stackoverflowuser2010

ok, nó đã được cuộn lại. Nó không thay đổi toàn bộ bản chất, nó làm rõ nó theo một trong hai hướng. Phương pháp tương tác sử dụng str(...)không thể mở rộng và hết hơi trên <100 cols.
smci

Câu trả lời:


215

Đặ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, typeofvà đứ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 đủ .


1
Sau khi sử dụng R trong vài tháng, tôi thấy đó 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.
stackoverflowuser2010

Xin chào khi tôi làm tương tự với ứng dụng thay vì áp dụng, nó không hoạt động
Dom Jo

@DomJo, tại sao bạn sẽ sử dụng apply()? Đó là cho ma trận. Khung dữ liệu là một danh sách (loại đặc biệt).
gung - Phục hồi Monica

50
sapply(yourdataframe, class)

Yourdataframe là tên của khung dữ liệu bạn đang sử dụng


18

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 foosẽ được thay thế bằng tên của khung dữ liệu của bạn.


7

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)

nhập mô tả hình ảnh ở đây


5

Đố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 mpgamthành ký tự và cột carbthà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

3

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.framecộ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ừ .


2

Đâ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!


1
Đáng lưu ý rằng dưới mui xe này là lapply(your_data, class)với một chút xử lý bổ sung để định dạng.
Gregor Thomas

1

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

1

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.