Kỹ thuật xử lý chuỗi ký tự

Để dễ hiển thị, hầu hết các code ví dụ đều mô phỏng trên một vectơ ngắn dạng ký tự đã được xác định, tuy nhiên chúng có thể dễ dàng áp dụng trên một cột trong bộ dữ liệu.

Chương này bao gồm:

  • Sử dụng hàm
    first_names <- c("abdul", "fahruk", "janice") 
    last_names  <- c("hussein", "akinleye", "okeke")
    
    # sep displays between the respective input strings, while collapse displays between the elements produced
    str_c(first_names, last_names, sep = " ", collapse = ";  ")
    8,
    first_names <- c("abdul", "fahruk", "janice") 
    last_names  <- c("hussein", "akinleye", "okeke")
    
    # sep displays between the respective input strings, while collapse displays between the elements produced
    str_c(first_names, last_names, sep = " ", collapse = ";  ")
    9, và
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    0 để ghép nối ký tự
  • Sử dụng hàm
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    1 để sắp xếp ký tự
  • Sử dụng hàm
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    2 và
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    3 để phân tách ký tự

Kết hợp các chuỗi ký tự

Để kết hợp hoặc nối nhiều chuỗi ký tự thành một chuỗi ký tự, chúng tôi khuyên bạn nên sử dụng hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
4 từ stringr. Nếu bạn có các giá trị ký tự riêng biệt để kết hợp, đơn giản chỉ cần cung cấp chúng dưới dạng đối số, được phân tách bằng dấu phẩy.

str_c("String1", "String2", "String3")

## [1] "String1String2String3"

Đối số

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
5 chèn một giá dạng trị ký tự vào giữa mỗi đối số ký tự bạn cung cấp (ví dụ: chèn dấu phẩy, dấu cách hoặc dòng mới
## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
6)

str_c("String1", "String2", "String3", sep = ", ")

## [1] "String1, String2, String3"

Đối số

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
7 có liên quan nếu bạn đang nhập nhiều vectơ làm đối số cho hàm
first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
8. Nó được sử dụng để tách các phần tử của một vectơ kết quả, sao cho vectơ kết quả chỉ là một phần tử chứa ký tự dài.

Ví dụ dưới đây cho thấy sự kết hợp của hai vectơ thành một (tên và họ). Một ví dụ tương tự khác có thể là các phạm vi địa chính và số lượng trường hợp. Trong ví dụ này:

  • Giá trị
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    5 xuất hiện giữa từng họ và tên
  • Giá trị
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    7 xuất hiện giữa tên từng người

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"

Lưu ý: Tùy thuộc vào trường hợp hiển thị mong muốn, khi in một chuỗi kết hợp như vậy với các dòng mới, bạn có thể cần phải đặt toàn bộ cụm từ trong hàm

# For newlines to print correctly, the phrase may need to be wrapped in cat()
cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
1 để các dòng mới được in đúng cách:

# For newlines to print correctly, the phrase may need to be wrapped in cat()
cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))

## abdul hussein;
## fahruk akinleye;
## janice okeke

Chuỗi động

Sử dụng hàm

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
9 để chèn đoạn code động của R vào chuỗi ký tự. Đây là một hàm hữu dụng để tạo tiêu đề biểu đồ động, như được mô tả dưới đây:

  • Tất cả nội dung nằm giữa dấu ngoặc kép
    # For newlines to print correctly, the phrase may need to be wrapped in cat()
    cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
    3
  • Bất kỳ đoạn code động hoặc tham chiếu nào đến các giá trị được xác định trước đều được đặt trong dấu ngoặc nhọn
    # For newlines to print correctly, the phrase may need to be wrapped in cat()
    cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
    4, bên trong dấu ngoặc kép. Có thể có nhiều dấu ngoặc nhọn trong cùng một câu lệnh
    first_names <- c("abdul", "fahruk", "janice") 
    last_names  <- c("hussein", "akinleye", "okeke")
    
    # sep displays between the respective input strings, while collapse displays between the elements produced
    str_c(first_names, last_names, sep = " ", collapse = ";  ")
    9.
  • Để hiển thị dấu ngoặc kép ", hãy sử dụng dấu ngoặc đơn bên trong dấu ngoặc kép (ví dụ: khi cung cấp định dạng ngày - xem ví dụ bên dưới)
  • Mẹo: Bạn có thể sử dụng
    # For newlines to print correctly, the phrase may need to be wrapped in cat()
    cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
    6 để bắt buộc xuống một dòng mới
  • Mẹo: Bạn có thể sử dụng hàm
    # For newlines to print correctly, the phrase may need to be wrapped in cat()
    cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
    7 để điều chỉnh hiển thị ngày và sử dụng hàm
    # For newlines to print correctly, the phrase may need to be wrapped in cat()
    cat(str_c(first_names, last_names, sep = " ", collapse = ";\n"))
    8 để hiển thị ngày hiện tại.

Một ví dụ đơn giản về tiêu đề biểu đồ động:

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")

## Data include 5888 cases and are current to 14 Oct 2021.

Một định dạng thay thế là sử dụng trình giữ chỗ (placeholder) bên trong dấu ngoặc kép và chỉ định chúng trong các đối số ở phía sau trong hàm

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
9 như bên dưới. Việc này sẽ làm tăng tính tường minh cho code nếu phần văn bản dài.

## [1] "String1String2String3"
0

## [1] "String1String2String3"
1

Kéo từ bộ dữ liệu

Đôi khi, sẽ rất hữu ích khi lấy dữ liệu từ một bộ dữ liệu và dán chúng lại với nhau theo trình tự. Dưới đây là một ví dụ về bộ dữ liệu. Chúng ta sẽ sử dụng cách này để có một phát biểu tóm tắt về các khu vực pháp lý, cũng như số ca mắc mới và tổng số ca.

## [1] "String1String2String3"
2

Sử dụng hàm

## abdul hussein;
## fahruk akinleye;
## janice okeke
0, được thiết kế để lấy dữ liệu từ các quan sát của bộ dữ liệu:

## [1] "String1String2String3"
3

## [1] "String1String2String3"
4

Kết hợp các chuỗi ký tự trên các dòng

Nếu bạn đang cố gắng để “gộp” các giá trị trong một cột của bộ dữ liệu, ví dụ: kết hợp các giá trị từ nhiều hàng thành một hàng bằng cách gắn chúng với nhau cùng ký tự phân cách, hãy xem thêm ở chương mục .

Một bộ dữ liệu thành một dòng

Bạn có thể tạo ra dãy thông tin chỉ trong một dòng bằng cách sử dụng lệnh

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
8 (cụ thể tên bộ dữ liệu và tên cột), đồng thời cung cấp các đối số
## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
5 và
## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
7.

## [1] "String1String2String3"
5

## [1] "String1String2String3"
6

Bạn có thể thêm đoạn tiền tố “New Cases:” vào đầu dòng thông tin bằng cách đặt trong hàm

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
8 (nếu “New Cases:” nằm trong hàm
first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
8 ban đầu thì nó sẽ xuất hiện nhiều lần).

## [1] "String1String2String3"
7

## [1] "String1String2String3"
8

Hợp nhất các cột

Trong bộ dữ liệu, việc tập hợp các giá trị dạng ký tự từ nhiều cột lại với nhau có thể thực hiện bằng cách dùng hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
0 từ package tidyr. Tính năng này ngược lại với hàm
## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
3.

Đầu tiên, cần tên của cột mới. Sau đó, cần tên của các cột mà bạn muốn hợp nhất.

  • Mặc định, dấu ngăn cách được sử dụng trong cột hợp nhất là dấu gạch dưới _, nhưng có thể được thay đổi bằng đối số
    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    5.
  • ## abdul hussein;
    ## fahruk akinleye;
    ## janice okeke
    9 loại bỏ các cột ban đầu ra khỏi bộ dữ liệu (mặc định là TRUE)
  • str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
    0 loại bỏ các giá trị bị thiếu trong khi hợp nhất (mặc định là FALSE)

Dưới đây, chúng tôi xác định một bộ dữ liệu ngắn để minh họa:

## [1] "String1String2String3"
9

str_c("String1", "String2", "String3", sep = ", ")
0

str_c("String1", "String2", "String3", sep = ", ")
1

Đây là bộ dữ liệu mẫu:

Dưới đây, chúng tôi hợp nhất ba cột triệu chứng:

str_c("String1", "String2", "String3", sep = ", ")
2

str_c("String1", "String2", "String3", sep = ", ")
3

Tách chuỗi

Để tách một chuỗi ký tự dựa trên một quy luật, hãy sử dụng hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
2. Hàm này đánh giá (các) chuỗi ký tự và trả về danh sách
str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
2 các vectơ ký tự chứa các giá trị mới được tách.

Ví dụ đơn giản dưới đây đánh giá một chuỗi ký tự và chia nó thành ba phần. Mặc định, hàm trả về một đối tượng kiểu danh sách

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
2 với một phần tử (một vectơ ký tự) cho mỗi chuỗi được cung cấp ban đầu. Nếu
str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
4 nó trả về một ma trận ký tự.

Trong ví dụ này, một chuỗi ký tự được cung cấp và hàm trả về một danh sách có một phần tử - một vectơ ký tự chứa ba giá trị.

str_c("String1", "String2", "String3", sep = ", ")
4

str_c("String1", "String2", "String3", sep = ", ")
5

Nếu kết quả được lưu, thì bạn có thể truy cập giá trị phân chia thứ n bằng cú pháp dấu ngoặc vuông. Để truy cập vào một giá trị cụ thể, bạn có thể sử dụng cú pháp như sau:

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
5, sẽ truy cập giá trị thứ hai từ chuỗi ký tự được đánh giá thứ nhất (“fever”). Xem thêm ở chương để biết thêm chi tiết về cách truy vấn các phần tử.

str_c("String1", "String2", "String3", sep = ", ")
6

str_c("String1", "String2", "String3", sep = ", ")
7

Nếu nhiều chuỗi ký tự được sử dụng trong hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
2, sẽ có nhiều hơn một phần tử trong danh sách trả về.

str_c("String1", "String2", "String3", sep = ", ")
8

str_c("String1", "String2", "String3", sep = ", ")
9

Thay vào đó, để trả về “ma trận chuỗi ký tự”, có thể sẽ hữu ích nếu tạo cột trong bộ dữ liệu, đặt đối số

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
4 như trình bày dưới đây:

## [1] "String1, String2, String3"
0

## [1] "String1, String2, String3"
1

Bạn cũng có thể điều chỉnh số phần tách ra với đối số

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
8. Ví dụ dưới đây giới hạn số phần tách ra là 2. Bất kỳ dấu phẩy nào khác vẫn sẽ nằm trong giá trị thứ hai.

## [1] "String1, String2, String3"
2

## [1] "String1, String2, String3"
3

Lưu ý - các kết quả tương tự có thể đạt được với hàm

str_glue("Data include {nrow(linelist)} cases and are current to {format(Sys.Date(), '%d %b %Y')}.")
9, trong đó bạn không dùng đối số
## Data include 5888 cases and are current to 14 Oct 2021.
0 mà thay vào đó phải chỉ định số cột (
## Data include 5888 cases and are current to 14 Oct 2021.
1).

## [1] "String1, String2, String3"
4

Tách cột

Nếu bạn đang cố gắng chia tách cột trong bộ dữ liệu, cách tốt nhất là sử dụng hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
3 từ package dplyr. Nó được sử dụng để chia một cột ký tự thành các cột khác nhau.

Giả sử chúng ta có một bộ dữ liệu đơn giản

## Data include 5888 cases and are current to 14 Oct 2021.
3 (được xác định và hợp nhất trong ) chứa một cột
## Data include 5888 cases and are current to 14 Oct 2021.
4 , một cột dạng ký tự có nhiều triệu chứng và một cột outcome. Mục tiêu của chúng ta là tách cột
## Data include 5888 cases and are current to 14 Oct 2021.
5 thành nhiều cột - mỗi cột chứa một triệu chứng.

Giả sử dữ liệu được đưa vào hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
3, trước tiên hãy chọn ra cột sẽ được phân tách. Sau đó, cung cấp thông tin tới đối số
## Data include 5888 cases and are current to 14 Oct 2021.
7 dưới dạng vectơ
## Data include 5888 cases and are current to 14 Oct 2021.
8 có chứa tên các cột mới, như được trình bày dưới đây.

  • Dấu phân cách trong

    ## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
    5 có thể là một ký tự hoặc một số (được hiểu là vị trí ký tự cần tách)

  • Mặc định là

    ## abdul hussein;
    ## fahruk akinleye;
    ## janice okeke
    9 FALSE, xóa cột đầu vào ban ban đầu

  • Mặc định là

    ## [1] "String1String2String3"
    01 FALSE, các ký tự “NA” sẽ thành
    ## [1] "String1String2String3"
    02

  • ## [1] "String1String2String3"
    03 kiểm soát điều gì sẽ xảy ra nếu có nhiều giá trị được tạo bởi sự phân tách nhiều hơn các cột mới được đặt tên.

    • ## [1] "String1String2String3"
      04 có nghĩa là bạn sẽ thấy một cảnh báo nhưng nó sẽ loại bỏ các giá trị thừa (mặc định là vậy)
    • ## [1] "String1String2String3"
      05 có nghĩa là các giá trị thừa sẽ bị loại bỏ mà không có cảnh báo
    • ## [1] "String1String2String3"
      06 sẽ chỉ phân tách thành số cột mới được liệt kê trong
      ## [1] "String1String2String3"
      07 - thiết lập này sẽ bảo toàn tất cả dữ liệu của bạn

Dưới đây là một ví dụ về

## [1] "String1String2String3"
06 - không có dữ liệu nào bị mất. Hai cột mới được xác định nhưng bất kỳ triệu chứng thứ ba nào sẽ quy về trong cột mới thứ hai:

## [1] "String1, String2, String3"
5

## [1] "String1, String2, String3"
6
## [1] "String1, String2, String3"
7

Khi sử dụng lệnh

## [1] "String1String2String3"
05 mặc định như bên dưới, một cảnh báo sẽ được đưa ra nhưng triệu chứng thứ ba bị mất:

## [1] "String1, String2, String3"
8

## [1] "String1, String2, String3"
9
## [1] "String1, String2, String3"
6
first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
1

CẨN TRỌNG: Nếu bạn không cung cấp đủ giá trị

## [1] "String1String2String3"
07 cho các cột mới, dữ liệu của bạn có thể bị cắt bớt .

Sắp xếp theo thứ tự bảng chữ cái

Một số chuỗi ký tự có thể được sắp xếp theo thứ tự bảng chữ cái. Hàm

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
1 trả về thứ tự của các phần tử, trong khi hàm
## [1] "String1String2String3"
12 trả về các chuỗi theo thứ tự đó.

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
2

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
3

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
4

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
5

Để sử dụng một bảng chữ cái khác, hãy thêm đối số

## [1] "String1String2String3"
13. Xem danh sách đầy đủ các locales bằng cách gõ
## [1] "String1String2String3"
14 trong cửa sổ R console.

Các hàm base R

Các hàm phổ biến của base R là

## [1] "String1String2String3"
15 và
## [1] "String1String2String3"
16 nối các vectơ sau khi chuyển đổi tất cả các cấu phần thành ký tự. Chúng hoạt động tương tự như
first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
8 nhưng cú pháp được cho là phức tạp hơn - đó là trong ngoặc thì mỗi phần được phân tách bằng một dấu phẩy. Các cấu phần là ký tự dạng văn bản (trong dấu ngoặc kép) hoặc các đối tượng được xác định trước (không có dấu ngoặc kép). Ví dụ:

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
6

first_names <- c("abdul", "fahruk", "janice") 
last_names  <- c("hussein", "akinleye", "okeke")

# sep displays between the respective input strings, while collapse displays between the elements produced
str_c(first_names, last_names, sep = " ", collapse = ";  ")
7

Đối số

## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
5 và
## [1] "abdul hussein;  fahruk akinleye;  janice okeke"
7 có thể được cụ thể. Hàm
## [1] "String1String2String3"
15 chỉ đơn giản dán
## [1] "String1String2String3"
16 vớ đối số mặc định
## [1] "String1String2String3"
22 (một khoảng trắng).