Các kiểu dữ liệu trong R với ví dụ
⚡ Tóm tắt thông minh
Các kiểu dữ liệu trong R xác định cách các giá trị được lưu trữ trong bộ nhớ, và các toán tử quyết định những gì R có thể làm với chúng. Vectơ, biến, toán tử số học, quan hệ, logic và gán được đề cập ở đây với các ví dụ có thể chạy được.
Các kiểu dữ liệu trong R là gì?
Sau đây là các Kiểu dữ liệu hoặc Cấu trúc dữ liệu trong Lập trình R:
- Vô hướng
- Các vectơ (số, ký tự, logic)
- Ma trận
- Khung dữ liệu
- Chức năng
Danh sách đó kết hợp hai ý tưởng có liên quan, và việc tách chúng ra sẽ giúp phần còn lại của trang này dễ theo dõi hơn. A loại dữ liệu Mô tả một giá trị đơn lẻ là gì — một con số, một đoạn văn bản, một giá trị ĐÚNG hoặc SAI. cấu trúc dữ liệu Mô tả số lượng giá trị được lưu giữ cùng nhau và hình dạng của chúng. Các giá trị vô hướng, vectơ, ma trận, khung dữ liệu và danh sách là các cấu trúc; các giá trị bên trong chúng vẫn thuộc một trong các kiểu dữ liệu cơ bản của R.
| Structure | Kích thước | Có được phép kết hợp nhiều loại không? | Sử dụng điển hình |
|---|---|---|---|
| Vô hướng | Vectơ có độ dài 1 | Không | Một phép đo hoặc cờ đơn lẻ |
| vector | 1 | Không | Một cột các kết quả đo thuộc một loại nhất định. |
| Matrix | 2 | Không | Lưới số và đại số tuyến tính |
| Khung dữ liệu | 2 | Vâng, mỗi cột một loại dữ liệu. | Bộ dữ liệu dạng bảng |
| Danh sách | 1, nhưng có thể lồng vào nhau | Vâng, bất cứ thứ gì cho mỗi phần tử | Kết quả mô hình và các thùng chứa hỗn hợp |
R không có kiểu dữ liệu vô hướng riêng biệt: một giá trị vô hướng đơn giản chỉ là một vectơ có độ dài bằng một, đó là lý do tại sao rất nhiều đoạn mã R được viết cho toàn bộ vectơ cùng một lúc.
Các kiểu dữ liệu cơ bản trong R
Mọi giá trị trong R đều thuộc về một trong số ít các kiểu dữ liệu cơ bản (nguyên tử):
- 4.5 là một giá trị thập phân được gọi là số học.
- Số 4 trông giống như một số nguyên, nhưng R vẫn lưu trữ nó dưới dạng số thực. Hãy viết 4L khi cần một số nguyên thực sự.
- TRUE hoặc FALSE là một giá trị Boolean, được gọi là giá trị logic trong R.
- Giá trị bên trong dấu ngoặc kép ” ” hoặc ' ' là văn bản (một chuỗi ký tự). Những giá trị đó được gọi là ký tự.
Hai loại nữa hoàn thiện bộ sưu tập. Các giá trị phức như 3+2i chứa phần thực và phần ảo, còn các giá trị thô chứa byte. Cả hai loại này hiếm khi xuất hiện trong phân tích hàng ngày, nhưng chúng được liệt kê trong R cơ bản. tài liệu về typeof() bên cạnh bốn loại phổ biến.
| Kiểu | Giá trị ví dụ | class() trả về | typeof() trả về |
|---|---|---|---|
| logic | TRUE | hợp lý | hợp lý |
| Số nguyên | 4L | số nguyên | số nguyên |
| Double (số) | 4.5 | số | tăng gấp đôi |
| Nhân vật | "R thật tuyệt vời" | tính cách | tính cách |
| Phức tạp | 3 + 2i | phức tạp | phức tạp |
| Nguyên | as.raw(10) | nguyên | nguyên |
Chúng ta có thể kiểm tra kiểu dữ liệu của một biến bằng hàm lớp.
Ví dụ 1: Kiểm tra một biến số
# Declare variables of different types # Numeric x <- 28 class(x)
Đầu ra:
## [1] "numeric"
Ví dụ 2: Kiểm tra một biến ký tự
# String y <- "R is Fantastic" class(y)
Đầu ra:
## [1] "character"
Ví dụ 3: Kiểm tra một biến logic
# Boolean z <- TRUE class(z)
Đầu ra:
## [1] "logical"
Lưu ý rằng hàm class() trả về "numeric" cho số 28 mặc dù 28 không có phần thập phân. R đã lưu trữ nó dưới dạng số thực (double), và chỉ có hàm typeof() mới tiết lộ điều đó. Sự khác biệt tiếp theo đáng để tìm hiểu là cách các giá trị đó được đặt tên.
Các biến trong R
Biến là một trong những khối xây dựng cơ bản trong R dùng để lưu trữ giá trị, và chúng rất quan trọng đối với bất kỳ ai làm việc trong lĩnh vực khoa học dữ liệu. Một biến trong R có thể lưu trữ một số, một đối tượng, một kết quả thống kê, một vectơ, một tập dữ liệu hoặc một dự đoán mô hình — về cơ bản là bất cứ thứ gì R xuất ra. Chúng ta có thể sử dụng biến đó sau này chỉ bằng cách gọi tên của biến.
Để khai báo một biến trong R, chúng ta cần gán một tên biến. Tên biến không được chứa dấu cách. Chúng ta có thể sử dụng dấu gạch dưới (_) để nối hai từ.
Tên biến có thể chứa chữ cái, chữ số, dấu chấm và dấu gạch dưới, nhưng phải bắt đầu bằng một chữ cái hoặc dấu chấm, và không được sử dụng các từ khóa dành riêng như TRUE, FALSE và NULL làm tên biến. Để thêm giá trị vào biến, hãy sử dụng <- hoặc =.
Đây là cú pháp:
# First way to declare a variable: use the `<-` name_of_variable <- value # Second way to declare a variable: use the `=` name_of_variable = value
Trên dòng lệnh, chúng ta có thể viết các mã sau để xem điều gì xảy ra:
Ví dụ 1: Gán một giá trị và in ra kết quả
# Print variable x
x <- 42
x
Đầu ra:
## [1] 42
Ví dụ 2: Khai báo biến thứ hai
y <- 10 y
Đầu ra:
## [1] 10
Ví dụ 3: Sử dụng hai biến trong một biểu thức
# We call x and y and apply a subtraction
x-y
Đầu ra:
## [1] 32
Một biến chứa nhiều giá trị cùng kiểu dữ liệu được gọi là vectơ, đây là cấu trúc mà hầu hết các hàm trong R đều yêu cầu.
Các vectơ trong R
Vector là một tập hợp một chiều trong đó mọi phần tử đều có cùng kiểu dữ liệu. Chúng ta có thể tạo một vector với tất cả các kiểu dữ liệu cơ bản trong R đã học trước đó. Cách đơn giản nhất để xây dựng một vector trong R là sử dụng hàm c().
Ví dụ 1: Tạo một vectơ số
# Numerical
vec_num <- c(1, 10, 49)
vec_num
Đầu ra:
## [1] 1 10 49
Ví dụ 2: Tạo một vectơ ký tự
# Character vec_chr <- c("a", "b", "c") vec_chr
Đầu ra:
## [1] "a" "b" "c"
Ví dụ 3: Tạo một vectơ logic
# Boolean vec_bool <- c(TRUE, FALSE, TRUE) vec_bool
Đầu ra:
##[1] TRUE FALSE TRUE
Nếu hàm c() nhận được một hỗn hợp các kiểu dữ liệu, nó sẽ không báo lỗi. Nó tự động chuyển đổi mọi phần tử lên kiểu dữ liệu tổng quát nhất hiện có, vì vậy c(1, "a", TRUE) trở thành một vectơ ký tự. Chúng ta cũng có thể thực hiện các phép tính số học trên vectơ trong R.
Ví dụ 4: Cộng hai vectơ từng phần tử một
# Create the vectors vect_1 <- c(1, 3, 5) vect_2 <- c(2, 4, 6) # Take the sum of A_vector and B_vector sum_vect <- vect_1 + vect_2 # Print out total_vector sum_vect
Đầu ra:
[1] 3 7 11
Phép cộng được thực hiện từng phần tử một vì cả hai vectơ đều có cùng độ dài. Khi độ dài khác nhau, R sẽ sử dụng lại vectơ ngắn hơn, lặp lại cho đến khi nó khớp với vectơ dài hơn, và chỉ cảnh báo khi độ dài của vectơ dài hơn không phải là bội số của vectơ ngắn hơn.
Ví dụ 5: Cắt năm phần tử đầu tiên
Trong R, ta có thể cắt một vectơ. Trong một số trường hợp, ta chỉ quan tâm đến năm phần tử đầu tiên của một vectơ. Ta có thể sử dụng lệnh [1:5] để thực hiện điều này.tract với các giá trị từ 1 đến 5.
# Slice the first five rows of the vector
slice_vector <- c(1,2,3,4,5,6,7,8,9,10)
slice_vector[1:5]
Đầu ra:
## [1] 1 2 3 4 5
Ví dụ 6: Xây dựng một phạm vi bằng dấu hai chấm Operator
Cách ngắn gọn nhất để tạo một dãy giá trị là sử dụng toán tử dấu hai chấm (:) giữa hai số. Ví dụ, từ ví dụ trên, ta có thể viết c(1:10) để tạo một vectơ các giá trị từ một đến mười.
# Faster way to create adjacent values
c(1:10)
Đầu ra:
## [1] 1 2 3 4 5 6 7 8 9 10
Vì kiểu dữ liệu của một vector tự động thay đổi khi được trộn lẫn, nên việc biết cách kiểm tra và chuyển đổi kiểu dữ liệu khi cần thiết là rất quan trọng.
Cách kiểm tra và chuyển đổi kiểu dữ liệu trong R
Ba nhóm hàm trả lời ba câu hỏi thường xuyên xuất hiện: đây là gì, đây có phải là một kiểu dữ liệu nhất định không, và liệu nó có thể chuyển đổi thành một kiểu dữ liệu khác hay không.
| Họ chức năng | Câu hỏi nó trả lời | Các ví dụ |
|---|---|---|
| class(), typeof(), mode() | Giá trị này thuộc loại nào? | lớp(28), kiểu(28), chế độ(28) |
| là.*() | Giá trị này có phải là kiểu X không? | is.numeric(), is.character(), is.logical() |
| BẰNG.*() | Giá trị này có thể chuyển thành kiểu X không? | as.numeric(), as.character(), as.integer() |
| str () | Nhìn tổng thể, vật thể này trông như thế nào? | str(vec_num) |
# Three different views of the same value x <- 28 class(x) # "numeric" -- the class used for method dispatch typeof(x) # "double" -- how R stores the value internally mode(x) # "numeric" -- the older S-style mode # Ask a yes/no question about a type is.numeric(x) # TRUE is.character(x) # FALSE # Convert between types as.character(x) # "28" as.integer("28") # 28 stored as an integer as.numeric("abc") # NA, with a coercion warning
Hai quy tắc giải thích hầu hết các điều bất ngờ ở đây. Thứ nhất, `class()` báo cáo lớp được sử dụng để gọi phương thức trong khi `typeof()` báo cáo bộ nhớ trong, đó là lý do tại sao 28 là "numeric" đối với cái này và "double" đối với cái kia. Thứ hai, một chuyển đổi không thành công không làm dừng tập lệnh: `as.numeric("abc")` trả về NA và in ra cảnh báo ép kiểu, vì vậy các giá trị NA không được trả về sau khi nhập hầu như luôn là vấn đề về kiểu dữ liệu. Logic tương tự cũng được áp dụng cho các trường hợp khác. các yếu tố, lưu trữ các danh mục dưới dạng mã số nguyên cộng với một bảng cấp độ.
Sau khi đã xác định được các kiểu dữ liệu, bước tiếp theo là tìm hiểu các toán tử tác động lên chúng.
R Số học Operaxoắn
Trước tiên, chúng ta sẽ xem xét các toán tử số học cơ bản trong R. Sau đây là các toán tử số học trong lập trình R và ý nghĩa của chúng:
| Operator | Mô tả Chi tiết |
|---|---|
| + | Ngoài ra |
| – | Subtracsản xuất |
| * | Phép nhân |
| / | Phòng |
| ^ hoặc ** | Phép tính |
| %% | Modulo (phần dư sau phép chia) |
| %/% | Phép chia số nguyên (thương, bỏ phần dư) |
Mỗi toán tử này đều được vector hóa, vì vậy cùng một biểu thức có thể áp dụng cho một giá trị đơn lẻ hoặc cho toàn bộ cột.
Ví dụ 1: Phép cộng
# An addition
3 + 4
Đầu ra:
## [1] 7
Bạn có thể dễ dàng sao chép và dán đoạn mã R ở trên vào... RStudio Console. Trong bài viết này, kết quả được hiển thị trên các dòng bắt đầu bằng ##. Ví dụ, nếu chúng ta viết mã print("Guru99") bảng điều khiển in [1] "Guru99", mà trang này sẽ hiển thị là ## [1] "Guru99 ".
## đánh dấu một dòng đầu ra được in và số trong ngoặc vuông ([1]) là chỉ số của giá trị đầu tiên trên dòng đó, không phải là một phần của kết quả.
Các câu bắt đầu bằng # là các chú thích. Chúng ta có thể sử dụng # bên trong một kịch bản R để thêm bất kỳ ghi chú nào mình muốn, và R sẽ bỏ qua nó khi chạy.
Ví dụ 2: Phép nhân
# A multiplication
3*5
Đầu ra:
## [1] 15
Ví dụ 3: Phép chia
# A division
(5+5)/2
Đầu ra:
## [1] 5
Ví dụ 4: Lũy thừa
# Exponentiation
2^5
Đầu ra:
## [1] 32
Ví dụ 5: Phép toán modulo
# Modulo
28%%6
Đầu ra:
## [1] 4
Phép toán số học tạo ra các con số. Nhóm toán tử tiếp theo tạo ra giá trị TRUE và FALSE.
R Quan hệ (So sánh) Operaxoắn
Các toán tử quan hệ so sánh hai giá trị và trả về một kết quả logic. Chúng là các toán tử xây dựng các điều kiện được sử dụng để lọc, và chúng được vector hóa theo cùng một cách như các toán tử số học.
| Operator | Mô tả Chi tiết |
|---|---|
| > | Lớn hơn |
| < | Less hơn |
| >= | Lớn hơn hoặc bằng |
| <= | Less hơn hoặc bằng |
| == | Chính xác bằng |
| != | Không bằng |
a <- 10 b <- 3 a > b # TRUE a < b # FALSE a >= 10 # TRUE a <= 3 # FALSE a == b # FALSE a != b # TRUE # Relational operators are vectorised scores <- c(45, 78, 90, 62) scores >= 60 # FALSE TRUE TRUE TRUE
Hai thói quen sau sẽ giúp tiết kiệm thời gian ở đây. Sử dụng == để so sánh và <- để gán, vì việc sử dụng một dấu = duy nhất bên trong điều kiện là một lỗi thường gặp của người mới bắt đầu. Và tránh sử dụng == trên số thực: làm tròn số thực có nghĩa là 0.1 + 0.2 == 0.3 là SAI, vì vậy isTRUE(all.equal(0.1 + 0.2, 0.3)) là phép thử an toàn. So sánh trên khung dữ liệu đã được sắp xếp Hãy tuân theo cùng một quy tắc.
R Hợp lý Operaxoắn
Với các toán tử logic, chúng ta muốn trả về các giá trị bên trong vectơ dựa trên các điều kiện logic. Bảng dưới đây liệt kê các toán tử logic có sẵn trong R.
Các mệnh đề logic trong R được đặt trong dấu ngoặc vuông []. Chúng ta có thể thêm bao nhiêu mệnh đề điều kiện tùy thích, nhưng cần phải đặt chúng trong dấu ngoặc đơn. Chúng ta có thể sử dụng cấu trúc này để tạo một mệnh đề điều kiện:
variable_name[(conditional_statement)]
Với `variable_name` chỉ định biến mà chúng ta muốn sử dụng trong câu lệnh, ta tạo ra mệnh đề logic, ví dụ: `variable_name > 0`. Cuối cùng, ta sử dụng dấu ngoặc vuông để hoàn tất mệnh đề logic. Dưới đây là một ví dụ về mệnh đề logic.
Ví dụ 1: So sánh từng phần tử của một vectơ
# Create a vector from 1 to 10
logical_vector <- c(1:10)
logical_vector>5
Đầu ra:
## [1]FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
Trong kết quả đầu ra ở trên, R đọc từng giá trị và so sánh nó với điều kiện logical_vector>5. Nếu giá trị lớn hơn 5, thì điều kiện là TRUE, ngược lại là FALSE. R trả về một vectơ gồm các giá trị TRUE và FALSE.
Ví dụ 2: Chỉ giữ lại các phần tử khớp nhau
Trong ví dụ dưới đây, chúng ta muốn thực hiện phép tính ex.tracCác giá trị chỉ thỏa mãn điều kiện 'lớn hơn năm'. Để làm điều đó, ta có thể đặt điều kiện trong dấu ngoặc vuông, đứng sau vectơ chứa các giá trị.
# Print value strictly above 5
logical_vector[(logical_vector>5)]
Đầu ra:
## [1] 6 7 8 9 10
Ví dụ 3: Kết hợp hai điều kiện
# Print 5 and 6
logical_vector <- c(1:10)
logical_vector[(logical_vector>4) & (logical_vector<7)]
Đầu ra:
## [1] 5 6
Ví dụ 3 sử dụng ký hiệu & đơn một cách có chủ đích. Các toán tử một ký tự & và | so sánh các vectơ từng phần tử một và trả về một vectơ, đó là điều cần thiết để chọn tập con. Các dạng toán tử kép && và || trả về một giá trị và thuộc về các điều kiện if() và while(). Vì vậy, R 4.3.0Việc truyền một đối số dài hơn một phần tử cho toán tử && hoặc || sẽ báo lỗi chứ không phải cảnh báo, vì vậy hai nhóm toán tử này không còn có thể thay thế cho nhau nữa. Toán tử ! phủ định một điều kiện, và xor() thực hiện phép toán OR độc quyền.
Bài tập R Operaxoắn
Các toán tử gán liên kết một giá trị với một tên. Ngôn ngữ R cung cấp nhiều toán tử gán hơn hầu hết các ngôn ngữ khác, và sự khác biệt giữa chúng rất quan trọng khi mã được chuyển sang giai đoạn viết. chức năng.
| Operator | Mô tả Chi tiết |
|---|---|
| <- | Phép gán trái, cách diễn đạt thông dụng trong R. |
| = | Gán giá trị bên trái, nhưng thông thường chỉ dành cho các đối số hàm. |
| -> | Phân công đúng, hợp lệ nhưng ít khi được sử dụng. |
| << - | Nhiệm vụ siêu cấp tìm kiếm các môi trường bao quanh |
| - >> | Phân công siêu cấp bên phải |
# Left assignment -- the idiomatic form count <- 5 # Equals sign: works, but reserve it for function arguments count = 5 round(3.14159, digits = 2) # Right assignment 5 -> count # Superassignment, used inside functions to reach an outer scope count <<- 5
Các hướng dẫn về cú pháp khuyên dùng <<- để tạo đối tượng và = để đặt tên các đối số bên trong một lời gọi hàm, vì như vậy hai vai trò này sẽ dễ phân biệt hơn về mặt hình ảnh. Sử dụng <<- một cách tiết kiệm: nó thay đổi một đối tượng bên ngoài hàm hiện tại và làm cho mã khó hiểu hơn. Khi đã quen thuộc với phép gán và kiểu dữ liệu, các bước tiếp theo là... nhập dữ liệu thực và reshaping nó với dplyr; Các Tổng quan về ngôn ngữ R Đặt toàn bộ chuỗi công cụ vào đúng ngữ cảnh.

