Tại sao dùng câu lệnh bysort trong stata

Chương này trình bày các bước phổ biến được sử dụng trong quá trình “làm sạch” bộ dữ liệu và cũng giải thích việc sử dụng các hàm quản lý dữ liệu thiết yếu trong R.

Để giải thích rõ hơn quá trình làm sạch dữ liệu, chương này bắt đầu từ cách nhập bộ dữ liệu thô có tên linelist và tiến hành từng bước trong quá trình làm sạch. Trong code R, quy trình này được biểu thị dưới dạng một chuỗi “pipe”, tham chiếu đến toán tử “pipe”

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)8 để chuyển tiếp từ thao tác này sang thao tác tiếp theo trong cùng một bộ dữ liệu.

Các hàm quan trọng

Cuốn sách này nhấn mạnh việc sử dụng các hàm từ hệ sinh thái của package tidyverse. Các hàm thiết yếu trong R trình bày trong chương này được liệt kê dưới đây.

Nhiều hàm thuộc về package dplyr, mà cung cấp các hàm dạng “verb” để giải quyết các thách thức trong thao tác xử lý dữ liệu (tên package được viết đầy đủ là "data frame-plier. dplyr là một phần trong hệ sinh thái của package tidyverse (mà bao gồm các package khác như ggplot2, tidyr, stringr, tibble, purrr, magrittr, và forcats).

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)8“pipe” (chuyển tiếp) dữ liệu từ một hàm sang hàm tiếp theomagrittr

linelist_raw <- import("linelist_raw.xlsx")00tạo, chuyển dạng, và định nghĩa lại cộtdplyr

linelist_raw <- import("linelist_raw.xlsx")01giữ lại, xóa, chọn, hoặc đổi tên cộtdplyr

linelist_raw <- import("linelist_raw.xlsx")02đổi tên cộtdplyr

linelist_raw <- import("linelist_raw.xlsx")03chuẩn hóa cú pháp tên cộtjanitor

linelist_raw <- import("linelist_raw.xlsx")04,

linelist_raw <- import("linelist_raw.xlsx")05,

linelist_raw <- import("linelist_raw.xlsx")06, etc.chuyển đổi định dạng cộtbase R

linelist_raw <- import("linelist_raw.xlsx")07biến đổi đồng thời nhiều cộtdplyrcác hàm tidyselectsử dụng logic để chọn cộttidyselect

linelist_raw <- import("linelist_raw.xlsx")08giữ lại các dòng theo điều kiệndplyr

linelist_raw <- import("linelist_raw.xlsx")09lọc quan sát trùngdplyr

linelist_raw <- import("linelist_raw.xlsx")10xử lý theo/trong mỗi dòngdplyr

linelist_raw <- import("linelist_raw.xlsx")11thêm dòng thủ côngtibble

linelist_raw <- import("linelist_raw.xlsx")12săp xếp dòngdplyr

linelist_raw <- import("linelist_raw.xlsx")13recode lại giá trị trong cộtdplyr

linelist_raw <- import("linelist_raw.xlsx")14recode lại giá trị trong cột kèm các điều kiện phức tạpdplyr

linelist_raw <- import("linelist_raw.xlsx")15,

linelist_raw <- import("linelist_raw.xlsx")16,

linelist_raw <- import("linelist_raw.xlsx")17các hàm đặc biệt để recodetidyr

linelist_raw <- import("linelist_raw.xlsx")18 and

linelist_raw <- import("linelist_raw.xlsx")19tạo biến phân nhóm từ biến định lượngepikit và base R

linelist_raw <- import("linelist_raw.xlsx")20recode/làm sạch giá trị sử dụng từ điển dữ liệulinelist

linelist_raw <- import("linelist_raw.xlsx")21áp dụng các điều kiện logic; trả về các chỉ sốbase R

Nếu bạn muốn xem các hàm này so sánh với các câu lệnh trong Stata hoặc SAS, hãy xem chương Chuyển đổi sang R.

Bạn cũng có thể gặp một framework quản lý dữ liệu khác từ package data.table trong R với các toán tử như

linelist_raw <- import("linelist_raw.xlsx")22 và thường xuyên sử dụng dấu ngoặc

linelist_raw <- import("linelist_raw.xlsx")23. Cách tiếp cận và cú pháp này được giải thích ngắn gọn trong chương Data Table.

Thuật ngữ

Trong cuốn sách này, chúng tôi quy ước chung “cột” và “hàng” thay cho “biến” và “quan sát”. Như đã giải thích trong phần dẫn trên “dữ liệu gọn gàng - tidy data”, hầu hết các bộ dữ liệu dịch tễ-thống kê đều có cấu trúc gồm các hàng, cột và giá trị.

Variables (biến) chứa các giá trị đo lường cùng một thuộc tính cơ bản (như nhóm tuổi, kết quả hoặc ngày bắt đầu). Observations (quan sát) chứa tất cả các giá trị được đo trên cùng một đơn vị (ví dụ: một người, địa điểm hoặc mẫu phòng thí nghiệm). Vì vậy, những khía cạnh này có thể khó xác định một cách hữu hình hơn.

Trong bộ dữ liệu “tidy”, mỗi cột là một biến, mỗi hàng là một quan sát và mỗi ô là một giá trị duy nhất. Tuy nhiên, một số bộ dữ liệu bạn gặp phải sẽ không giống với mô tả này - bộ dữ liệu định dạng “wide (ngang)” có thể có một biến số được chia thành nhiều cột (xem ví dụ trong chương Xoay trục dữ liệu). Tương tự như vậy, các quan sát có thể được chia thành nhiều hàng.

Cuốn sách này tập trung về quản lý và biến đổi dữ liệu, do đó, việc đề cập đến cấu trúc dữ liệu cụ thể của các hàng và cột sẽ thích hợp hơn là các quan sát và biến vốn khá trừu tượng. Các trường hợp ngoại lệ chủ yếu xảy ra trong các chương về phân tích dữ liệu, nơi bạn sẽ thấy nhiều tham chiếu hơn đến các biến và quan sát.

Chương này tiến hành các bước làm sạch điển hình, bằng cách thêm chúng tuần tự vào một chuỗi pipe.

Trong phân tích dịch tễ học và xử lý dữ liệu, các bước làm sạch thường được thực hiện tuần tự, liên kết với nhau. Trong R, việc này thường được thực hiện dưới dạng một “pipeline - đường ống” làm sạch, trong đó bộ dữ liệu thô được chuyển tiếp hoặc “dẫn” từ bước làm sạch này sang bước làm sạch khác.

Các chuỗi như vậy sử dụng các hàm dạng “verb” trong package dplyr và toán tử pipe

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)8 trong package magrittr. Chuỗi pipe bắt đầu từ dữ liệu “thô” (“linelist_raw.xlsx”) và kết thúc bằng bộ dữ liệu “sạch” trên R (

linelist_raw <- import("linelist_raw.xlsx")25) có thể được sử dụng, lưu, xuất, v.v.

Trong quy trình làm sạch dữ liệu, thứ tự của các bước là quan trọng. Các bước làm sạch có thể bao gồm:

  • Nhập dữ liệu
  • Làm sạch hoặc đổi tên cột
  • Loại bỏ trùng lặp
  • Tạo và chuyển đổi cột (ví dụ: mã hóa lại hoặc chuẩn hóa các giá trị)
  • Lọc hoặc thêm hàng

Đoạn code này trình bày cách gọi các package cần thiết cho phân tích. Trong cuốn sách này, chúng tôi nhấn mạnh đến hàm

linelist_raw <- import("linelist_raw.xlsx")26 từ package pacman, cài đặt package nếu cần và gọi package ra để sử dụng. Bạn cũng có thể gọi các package đã cài đặt với hàm

linelist_raw <- import("linelist_raw.xlsx")27 sẵn có trong base R. Xem chương R cơ bản để biết thêm thông tin về các package trong R.

pacman::p_load( rio, # importing data here, # relative file pathways janitor, # data cleaning and tables lubridate, # working with dates epikit, # age_categories() function tidyverse # data management and visualization )

Nhập

Ở đây, chúng ta sẽ nhập tệp tin Excel “thô” bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")28 từ package rio. Package rio có thể xử lý linh hoạt nhiều loại tệp tin (ví dụ: .xlsx, .csv, .tsv, .rds. Xem chương về Nhập xuất dữ liệu để biết thêm thông tin và mẹo về các tình huống bất thường (ví dụ: loại bỏ hàng, thiết lập giá trị trống, nạp trang tính Google, v.v.).

Nếu bạn muốn hiểu rõ hơn, hãy tải xuống tệp dữ liệu linelist “thô” (với file dạng .xlsx).

Nếu bộ dữ liệu của bạn quá lớn và mất nhiều thời gian để nhập, sẽ hữu ích khi bạn đặt lệnh nhập dữ liệu riêng biệt với chuỗi pipe và dữ liệu “thô” sẽ được lưu thành một tệp riêng biệt. Điều này cũng cho phép dễ dàng so sánh giữa phiên bản gốc và phiên bản đã làm sạch.

Dưới đây, chúng ta nạp một tệp Excel thô và lưu nó dưới dạng dataframe

linelist_raw <- import("linelist_raw.xlsx")29. Chúng tôi giả định rằng tệp này nằm trong thư mục làm việc của bạn hoặc thư mục gốc của dự án R và vì vậy không có thư mục con nào được chỉ định trong đường dẫn tệp.

linelist_raw <- import("linelist_raw.xlsx")

Bạn có thể xem 50 hàng đầu tiên của bộ dữ liệu bên dưới. Lưu ý: hàm

linelist_raw <- import("linelist_raw.xlsx")30 trong base R cho phép bạn chỉ xem

linelist_raw <- import("linelist_raw.xlsx")31 hàng đầu tiên trong R console.

Đánh giá

Bạn có thể sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")32 từ package skimr để có cái nhìn tổng quan về toàn bộ bộ dữ liệu (xem chương Bảng mô tả để biết thêm thông tin). Các cột được tóm tắt theo phân lớp/định dạng như ký tự và số. Lưu ý: “POSIXct” là một loại phân lớp ngày thô (xem chương Làm việc với ngày tháng.

skimr::skim(linelist_raw)

Table 8.1: Data summaryNamelinelist_rawNumber of rows6611Number of columns28_______________________Column type frequency:character17numeric8POSIXct3________________________Group variablesNone

Variable type: character

skim_variablen_missingcomplete_rateminmaxemptyn_uniquewhitespacecase_id1370.9866058880date onset2930.96101005800outcome15000.7757020gender3240.9511020hospital15120.775360130infector23230.6566026970source23230.6557020age1070.98120750age_unit71.0056020fever2580.9623020chills2580.9623020cough2580.9623020aches2580.9623020vomit2580.9623020time_admission8440.8755010910merged_header01.0011010…2801.0011010

Variable type: numeric

skim_variablen_missingcomplete_ratemeansdp0p25p50p75p100generation71.0016.605.710.0013.0016.0020.0037.00lon71.00-13.230.02-13.27-13.25-13.23-13.22-13.21lat71.008.470.018.458.468.478.488.49row_num01.003240.911857.831.001647.503241.004836.506481.00wt_kg71.0052.6918.59-11.0041.0054.0066.00111.00ht_cm71.00125.2549.574.0091.00130.00159.00295.00ct_blood71.0021.261.6716.0020.0022.0022.0026.00temp1580.9838.600.9535.2038.3038.8039.2040.80

Variable type: POSIXct

skim_variablen_missingcomplete_rateminmaxmediann_uniqueinfection date23220.652012-04-092015-04-272014-10-04538hosp date71.002012-04-202015-04-302014-10-15570date_of_outcome10680.842012-05-142015-06-042014-10-26575

Trong R, tên cột là “tiêu đề” hoặc giá trị “trên đỉnh” của một cột. Chúng được sử dụng để tham chiếu đến các cột trong đoạn code và đóng vai trò như một nhãn mặc định trong các bảng biểu.

Các phần mềm thống kê khác như SAS và STATA sử dụng “nhãn” là tên cột phiên bản dài hơn khi in, cùng tồn tại song song với tên cột. Mặc dù R cung cấp tính năng thêm nhãn của cột vào dữ liệu, nhưng điều này hầu hết không được nhấn mạnh trong thực tế. Để đặt tên cột “dễ nhìn” cho các bảng biểu, người ta thường điều chỉnh hiển thị của chúng trong các lệnh vẽ biểu đồ để tạo ra kết quả (ví dụ: tiêu đề trục hoặc chú giải của một biểu đồ hoặc tiêu đề cột trong bảng - xem thêm mục scales trong chương Các tips với ggplot và chương Trình bày bảng). Nếu bạn muốn gán nhãn cột trong dữ liệu, hãy đọc thêm tài liệu trực tuyến tại đây và tại đây.

Vì tên cột trong R được sử dụng rất thường xuyên, vì vậy chúng phải có cú pháp “sạch”. Chúng tôi đề xuất những tiêu chí sau:

  • Tên ngắn
  • Không có khoảng trắng (thay thế bằng dấu gạch dưới_)
  • Không có ký tự lạ (&, #, <, >, …)
  • Thống nhất cách định danh (vd: toàn bộ tên cột ngày như date_onset, date_report, date_death…)

Tên các cột trong

linelist_raw <- import("linelist_raw.xlsx")29 được in bên dưới bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")34 từ base R. Ban đầu chúng ta có thể thấy rằng:

  • Một số tên chứa khoảng trắng (vd:

    linelist_raw <- import("linelist_raw.xlsx")35)

  • Một số mẫu tên khác nhau được sử dụng cho biến ngày (

    linelist_raw <- import("linelist_raw.xlsx")36 và

    linelist_raw <- import("linelist_raw.xlsx")35)

  • Phải có một tiêu đề được hợp nhất ở hai cột cuối cùng trong tệp .xlsx. Chúng tôi biết điều này vì tên của hai cột được hợp nhất (“merge_header”) được R gán cho cột đầu tiên và cột thứ hai được gán tên giữ chỗ “… 28” (vì lúc đó nó trống và là cột thứ 28).

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"

CHÚ Ý: Để tham chiếu tên một cột có chứa khoảng trắng, hãy bao quanh tên cột bằng dấu huyền, ví dụ: linelist$

linelist_raw <- import("linelist_raw.xlsx")38. Lưu ý là trên bàn phím, dấu huyền (`) được phân biệt với dấu ngoặc đơn (’).

Làm sạch tự động

Hàm

linelist_raw <- import("linelist_raw.xlsx")03 từ package janitor chuẩn hóa tên cột và biến chúng thành duy nhất bằng cách thực hiện như sau:

  • Chuyển đổi tất cả các tên cột thành chỉ bao gồm dấu gạch dưới, số và chữ cái
  • Các ký tự có dấu được chuyển ngữ sang dạng ASCII (ví dụ: o tiếng Đức với âm sắc trở thành “o”, “enye” tiếng Tây Ban Nha trở thành “n”)
  • Tùy chọn viết hoa cho tên cột mới có thể được chỉ định bằng cách sử dụng đối số

    linelist_raw <- import("linelist_raw.xlsx")40 (mặc định là “snake”, các lựa chọn thay thế bao gồm “sentence”, “title”, “small_camel”…)

  • Bạn có thể chỉ định các tên thay thế cụ thể bằng cách cung cấp một vectơ tới đố số

    linelist_raw <- import("linelist_raw.xlsx")41 (ví dụ:

    linelist_raw <- import("linelist_raw.xlsx")42)

  • Đây là một hướng dẫn trực tuyến

Sau đây, quy trình làm sạch bắt đầu bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")03 trên bộ dữ liệu linelist thô.

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"

LƯU Ý: Tên cột cuối cùng “… 28” đã được đổi thành “x28”.

Làm sạch tên cột thủ công

Việc đặt tên lại các cột theo cách thủ công thường là cần thiết, ngay cả sau bước chuẩn hóa ở trên. Dưới đây, việc đổi tên được thực hiện bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")02 từ package dplyr, như một phần của quy trình.

linelist_raw <- import("linelist_raw.xlsx")02 sử dụng cú pháp

linelist_raw <- import("linelist_raw.xlsx")46 - tên cột mới được đặt trước tên cột cũ.

Dưới đây, một lệnh đổi tên được thêm vào quy trình làm sạch. Các khoảng trắng đã được thêm vào một cách chọn lọc để căn chỉnh code dễ đọc hơn.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)

Bây giờ bạn có thể thấy rằng tên các cột đã được thay đổi:

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"

Thay đối tên cột theo vị trí

Bạn cũng có thể đổi tên theo vị trí cột, thay vì tên cột, ví dụ:

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)

Đổi tên bằng hàm

linelist_raw <- import("linelist_raw.xlsx")01 và

linelist_raw <- import("linelist_raw.xlsx")48

Như một lối tắt, bạn cũng có thể đổi tên các cột bằng hàm

linelist_raw <- import("linelist_raw.xlsx")01 và

linelist_raw <- import("linelist_raw.xlsx")48 thuộc package dplyr. Hàm

linelist_raw <- import("linelist_raw.xlsx")01 được sử dụng để chỉ giữ một số cột nhất định (sẽ được đề cập sau trong chương này). Hàm

linelist_raw <- import("linelist_raw.xlsx")48 được đề cập trong các chương Nhóm dữ liệu và Bảng mô tả. Các hàm này cũng sử dụng định dạng

linelist_raw <- import("linelist_raw.xlsx")53. Đây là một ví dụ:

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)

Các thách thức khác

Cột trống tên trên file Excel

R không thể nhận diện các cột trong bộ dữ liệu mà không có tên cột (tiêu đề). Vì vậy, nếu bạn nhập một bộ dữ liệu Excel có dữ liệu nhưng không có tiêu đề cột, R sẽ điền vào các tiêu đề đó mặc định như “… 1” hoặc “… 2”. Phần số đại diện cho số cột (ví dụ: nếu cột thứ 4 trong bộ dữ liệu không có tiêu đề, thì R sẽ mặc định đặt tên là “… 4”).

Bạn có thể làm sạch các tên cột này theo cách thủ công bằng cách tham chiếu số vị trí của chúng (xem ví dụ ở trên) hoặc tên được chỉ định của chúng (

linelist_raw <- import("linelist_raw.xlsx")54).

Hợp nhất tên cột và ô Excel

Các ô được hợp nhất trong file Excel là một sự cố thường xảy ra khi nhận dữ liệu. Như đã giải thích trong chương Chuyển đổi sang R, các ô được hợp nhất có thể dễ nhìn cho con người đọc dữ liệu, nhưng không phải là “cấu trúc dữ liệu cơ bản” và gây ra nhiều vấn đề cho máy khi nhận diện dữ liệu. R không thể chứa các ô đã hợp nhất.

Nhắc nhở người nhập liệu rằng dữ liệu có thể đọc được bởi con người không giống với dữ liệu mà máy có thể đọc được. Hãy cố gắng đào tạo người dùng về các nguyên tắc về dữ liệu tidy. Nếu có thể, hãy cố gắng thay đổi quy trình để dữ liệu có định dạng gọn gàng hơn mà không hợp nhất các ô.

  • Mỗi biến phải là một cột riêng biệt
  • Mỗi quan sát phải là một dòng riêng biệt
  • Mỗi giá trị phải là một ô riêng biệt

Khi sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")28 của package rio, giá trị trong một ô đã hợp nhất sẽ được gán cho ô đầu tiên và các ô tiếp theo sẽ trống.

Một giải pháp để xử lý các ô đã hợp nhất là nạp dữ liệu bằng hàm

linelist_raw <- import("linelist_raw.xlsx")56 từ package openxlsx. Thiết lập đối số

linelist_raw <- import("linelist_raw.xlsx")57. Điều này cho phép giá trị trong ô hợp nhất được tham chiếu cho tất cả các ô nằm trong phạm vi hợp nhất.

linelist_raw <- import("linelist_raw.xlsx")0

NGUY HIỂM: Nếu các tên cột được hợp nhất với

linelist_raw <- import("linelist_raw.xlsx")56, có thể sẽ trả về tên cột trùng lặp, mà bạn sẽ cần phải sửa một cách thủ công - R không làm việc được với các tên cột trùng lặp! Bạn có thể đặt lại tên cho chúng bằng cách tham chiếu vị trí của chúng (ví dụ: cột 5), như được giải thích trong mục làm sạch tên cột thủ công.

Sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")01 từ package dplyr để chọn các cột bạn muốn giữ lại và sắp xếp lại thứ tự của chúng trong bộ dữ liệu.

CẨN TRỌNG: Trong các ví dụ dưới đây, bộ dữ liệu

linelist_raw <- import("linelist_raw.xlsx")25 được điều chỉnh với hàm

linelist_raw <- import("linelist_raw.xlsx")01 và được hiển thị, nhưng không được lưu. Việc này được sử dụng phục vụ mục đích mô tả. Tên cột đã sửa đổi được in ra bằng cách chuyển tiếp bộ dữ liệu tới hàm

linelist_raw <- import("linelist_raw.xlsx")34.

Dưới đây là TẤT CẢ các tên cột trong bộ dữ liệu linelist tại thời điểm làm sạch:

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"

Giữ cột

Giữ lại những cột mong muốn

Viết tên cột cần giữ trong hàm

linelist_raw <- import("linelist_raw.xlsx")01, không có dấu ngoặc kép. Kết quả trả về sẽ xuất hiện trong bộ dữ liệu theo thứ tự mà bạn cung cấp. Lưu ý rằng nếu bạn chỉ định một cột không tồn tại, R sẽ báo lỗi (xem cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")64 bên dưới nếu bạn không muốn gặp lỗi trong trường hợp này).

linelist_raw <- import("linelist_raw.xlsx")2

linelist_raw <- import("linelist_raw.xlsx")3

Hàm trợ giúp “tidyselect”

Các hàm trợ giúp này được xây dựng để giúp bạn dễ dàng chỉ định các cột cần giữ, loại bỏ hoặc chuyển đổi. Chúng nằm trong package tidyselect, thuộc hệ sinh thái tidyverse và làm cơ sở cho cách chọn cột trong các hàm dplyr.

Ví dụ: nếu bạn muốn sắp xếp lại các cột, hàm

linelist_raw <- import("linelist_raw.xlsx")65 là một hàm hữu ích để biểu thị “tất cả các cột khác chưa được đề cập”. Lệnh dưới đây di chuyển các cột

linelist_raw <- import("linelist_raw.xlsx")66 và

linelist_raw <- import("linelist_raw.xlsx")67 lên cột đầu tiên (bên trái) của bộ dữ liệu, nhưng vẫn giữ tất cả các cột khác sau đó. Lưu ý rằng hàm

linelist_raw <- import("linelist_raw.xlsx")65 được viết bằng dấu ngoặc đơn trống:

linelist_raw <- import("linelist_raw.xlsx")4

linelist_raw <- import("linelist_raw.xlsx")5

Dưới đây là các hàm trợ giúp “tidyselect” khác cũng hoạt động trong các hàm dplyr như

linelist_raw <- import("linelist_raw.xlsx")01,

linelist_raw <- import("linelist_raw.xlsx")07, và

linelist_raw <- import("linelist_raw.xlsx")48:

  • linelist_raw <- import("linelist_raw.xlsx")65 - tất cả các cột khác chưa được đề cập

  • linelist_raw <- import("linelist_raw.xlsx")73 - cột cuối cùng

  • linelist_raw <- import("linelist_raw.xlsx")74 - áp dụng một hàm cho tất cả các cột và chọn những cột trả về giá trị TRUE

  • linelist_raw <- import("linelist_raw.xlsx")75 - cột chứa một chuỗi ký tự

    • Ví dụ:

      linelist_raw <- import("linelist_raw.xlsx")76

  • linelist_raw <- import("linelist_raw.xlsx")77 - khớp với các tiền tố được chỉ định

    • Ví dụ:

      linelist_raw <- import("linelist_raw.xlsx")78

  • linelist_raw <- import("linelist_raw.xlsx")79 - khớp với các hậu tố được chỉ định

    • Ví dụ:

      linelist_raw <- import("linelist_raw.xlsx")80

  • linelist_raw <- import("linelist_raw.xlsx")81 - để áp dụng một mệnh đề chính quy (regex)

    • Ví dụ:

      linelist_raw <- import("linelist_raw.xlsx")82

  • linelist_raw <- import("linelist_raw.xlsx")83 - một khoảng số học như x01, x02, x03

  • linelist_raw <- import("linelist_raw.xlsx")64 - khớp NẾU cột tồn tại nhưng không báo lỗi nếu không tìm thấy

    • Ví dụ:

      linelist_raw <- import("linelist_raw.xlsx")85

Ngoài ra, sử dụng các toán tử bình thường như

linelist_raw <- import("linelist_raw.xlsx")86 để liệt kê danh sách cột, hoặc

linelist_raw <- import("linelist_raw.xlsx")87 cho các cột liên tiếp,

linelist_raw <- import("linelist_raw.xlsx")88 cho đối lập,

linelist_raw <- import("linelist_raw.xlsx")89 cho VÀ, và

linelist_raw <- import("linelist_raw.xlsx")90 cho HOẶC.

Sử dụng

linelist_raw <- import("linelist_raw.xlsx")74 để cụ thể tiêu chí logic cho các cột. Nếu đưa một hàm vào trong

linelist_raw <- import("linelist_raw.xlsx")74, hãy nhớ không bao gồm dấu ngoặc đơn trống của hàm đó. Câu lệnh bên dưới chọn các cột kiểu Số.

linelist_raw <- import("linelist_raw.xlsx")6

linelist_raw <- import("linelist_raw.xlsx")7

Sử dụng

linelist_raw <- import("linelist_raw.xlsx")75 để chọn các cột trong đó tên cột chứa một chuỗi ký tự được chỉ định.

linelist_raw <- import("linelist_raw.xlsx")79 và

linelist_raw <- import("linelist_raw.xlsx")77 cung cấp thêm các lựa chọn khác nhau.

linelist_raw <- import("linelist_raw.xlsx")8

linelist_raw <- import("linelist_raw.xlsx")9

Hàm

linelist_raw <- import("linelist_raw.xlsx")81 hoạt động tương tự như hàm

linelist_raw <- import("linelist_raw.xlsx")75 nhưng có thể được cung cấp một biểu thức chính quy (xem chương Ký tự và chuỗi), chẳng hạn như nhiều chuỗi được phân tách bằng toán tự OR trong dấu ngoặc đơn:

skimr::skim(linelist_raw)0

skimr::skim(linelist_raw)1

CẨN TRỌNG: Nếu tên cột mà bạn đưa ra không tồn tại trong dữ liệu, máy có thể báo lỗi và dừng code của bạn. Cân nhắc sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")64 để trích dẫn các cột có thể hoặc không thể tồn tại, đặc biệt hữu ích trong các lựa chọn loại trừ (loại bỏ).

Chỉ có một trong các cột này tồn tại, nhưng không có lỗi được báo và code sẽ tiếp tục các bước trong quy trình làm sạch.

skimr::skim(linelist_raw)2

skimr::skim(linelist_raw)3

Xóa cột

Chỉ ra cột nào cần loại bỏ bằng cách đặt biểu tượng dấu trừ “-” ở phía trước tên cột (ví dụ:

linelist_raw <- import("linelist_raw.xlsx")99) hoặc một vectơ tên các cột (như bên dưới). Tất cả các cột khác sẽ được giữ nguyên.

skimr::skim(linelist_raw)4

skimr::skim(linelist_raw)5

Bạn cũng có thể xóa một cột bằng cú pháp trong base R, bằng cách định nghĩa nó là

skimr::skim(linelist_raw)00. Ví dụ:

skimr::skim(linelist_raw)6

Hoạt động độc lập

linelist_raw <- import("linelist_raw.xlsx")01 cũng có thể được sử dụng như một lệnh độc lập (không bắt buộc trong chuỗi các bước làm sạch). Trong trường hợp này, đối số đầu tiên trong bộ dữ liệu gốc sẽ được tham chiếu.

skimr::skim(linelist_raw)7

skimr::skim(linelist_raw)8

Thêm vào quy trình làm sạch

Trong bộ dữ liệu

linelist_raw <- import("linelist_raw.xlsx")29, có một vài cột chúng ta không cần:

skimr::skim(linelist_raw)03,

skimr::skim(linelist_raw)04, và

skimr::skim(linelist_raw)05. Chúng ta xóa chúng bằng lệnh

linelist_raw <- import("linelist_raw.xlsx")01 trong chuỗi các bước làm sạch như sau:

skimr::skim(linelist_raw)9

Xem chương Loại bỏ trùng lặp để biết các tùy chọn mở rộng về cách loại bỏ dữ liệu trùng lặp. Chỉ một ví dụ rất đơn giản về cách loại bỏ hàng trùng lặp được trình bày ở chương này.

Package dplyr cung cấp hàm

linelist_raw <- import("linelist_raw.xlsx")09. Hàm này kiểm tra tất cả các hàng và rút gọn bộ dữ liệu cho chỉ còn các hàng là duy nhất. Nghĩa là, nó loại bỏ 100% các hàng trùng lặp.

Khi đánh giá các hàng trùng lặp, hàm này sẽ thực hiện trên các cột được chỉ định - mặc định nó sẽ xem xét tất cả các cột. Như trình bày trong chương loại bỏ trùng lặp, bạn có thể điều chỉnh phạm vi cột để việc khảo sát tính duy nhất của các hàng sẽ chỉ được đánh giá trong phạm vi một số cột nhất định.

Trong ví dụ đơn giản này, chúng ta chỉ cần thêm câu lệnh trống

linelist_raw <- import("linelist_raw.xlsx")09 vào chuỗi các bước làm sạch. Điều này đảm bảo không có hàng nào là bản sao 100% của các hàng khác (được đánh giá trên tất cả các cột).

Chúng ta bắt đầu với

skimr::skim(linelist_raw)09 hàng trong bộ

linelist_raw <- import("linelist_raw.xlsx")25.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"0

Sau khi loại bỏ trùng lặp, thì bộ dữ liệu mới có

skimr::skim(linelist_raw)09 hàng. Bất kỳ hàng nào bị xóa cũng có thể là 100% bản sao của các hàng khác.

Dưới đây, lệnh

linelist_raw <- import("linelist_raw.xlsx")09 được thêm vào quy trình làm sạch:

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"1

Chúng tôi khuyến khích sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")00 trong package dplyr để thêm một cột mới hoặc để sửa đổi một cột sẵn có.

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

linelist_raw <- import("linelist_raw.xlsx")00. Cú pháp là:

skimr::skim(linelist_raw)15

Trong Stata, điều này tương tự như lệnh

skimr::skim(linelist_raw)16, nhưng hàm

linelist_raw <- import("linelist_raw.xlsx")00 trong R còn có thể được sử dụng để điều chỉnh cột đã tồn tại.

Tạo cột mới

Tính năng cơ bản nhất của hàm

linelist_raw <- import("linelist_raw.xlsx")00 là để tạo một cột mới, có thể thấy trong ví dụ dưới đây. Nó tạo một cột mới

skimr::skim(linelist_raw)19 trong đó giá trị trong mỗi hàng đều là 10.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"2

Bạn cũng có thể tham chiếu các giá trị trong các cột khác, để thực hiện phép tính toán. Dưới đây, cột mới

skimr::skim(linelist_raw)20 được tạo để tính chỉ số khối cơ thể (BMI) cho mỗi trường hợp - như được tính bằng công thức BMI = kg/m^2, sử dụng cột

skimr::skim(linelist_raw)21 và cột

skimr::skim(linelist_raw)22.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"3

Nếu tạo nhiều cột mới, hãy tách riêng từng cột bằng dấu phẩy và dòng mới. Dưới đây là các ví dụ về tạo các cột mới, bao gồm một cột mà chứa các giá trị từ các cột khác được kết hợp bằng hàm

skimr::skim(linelist_raw)23 từ package stringr (xem chương Ký tự và chuỗi).

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"4

Kiểm tra các cột mới. Đối với mục tiêu minh họa, chỉ các cột mới và các cột được sử dụng để tạo cột mới được hiển thị:

MẸO: Một biến thể của hàm

linelist_raw <- import("linelist_raw.xlsx")00 là hàm

skimr::skim(linelist_raw)25. Hàm này thêm một cột mới giống như

linelist_raw <- import("linelist_raw.xlsx")00, nhưng cũng bỏ/xóa tất cả các cột khác mà bạn không đề cập trong dấu ngoặc đơn của hàm.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"5

Chuyển đổi kiểu dữ liệu của cột

Các cột chứa giá trị là ngày tháng, số hoặc giá trị logic (TRUE/FALSE) sẽ chỉ hoạt động như mong đợi nếu chúng được phân loại chính xác. Có sự khác biệt giữa “2” của phân lớp ký tự và 2 của phân lớp số!

Có nhiều cách để thiết lập kiểu dữ liệu cho cột trong các lệnh nhập, nhưng chúng thường phức tạp. Xem chương R cơ bản về các lớp đối tượng để tìm hiểu thêm về cách chuyển đổi phân lớp đối tượng và cột.

Đầu tiên, hãy kiểm tra các cột quan trọng để xem chúng đã đúng định dạng chính xác chưa. Chúng ta có thể phát hiện điều này ngay từ khi chúng ta chạy lệnh

linelist_raw <- import("linelist_raw.xlsx")32.

Hiện tại, kiểu của cột

skimr::skim(linelist_raw)28 là dạng ký tự. Để thực hiện các phân tích định lượng, chúng ta cần những giá trị số này được nhận biết là dạng số!

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"6

Phân lớp của cột

linelist_raw <- import("linelist_raw.xlsx")66 cũng là ký tự! Để thực hiện phân tích, những cột ngày này phải được nhận biết là dạng ngày tháng!

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"7

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"6

Để giải quyết vấn đề này, hãy sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")00 để định dạng và chuyển đổi lại một cột. Chúng ta giữ nguyên cột đó và định dạng lại sang một phân lớp khác. Sau đây là một ví dụ cơ bản, chuyển đổi hoặc đảm bảo rằng cột

skimr::skim(linelist_raw)28 là phân lớp dạng số:

Theo cách tương tự, bạn có thể sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")04 và hàm

skimr::skim(linelist_raw)33. Để chuyển đổi sang kiểu Factor, bạn có thể sử dụng hàm

skimr::skim(linelist_raw)34 từ base R hoặc hàm

skimr::skim(linelist_raw)35 từ package forcats. Đọc thêm ở chương Factors.

Bạn phải cẩn thận khi chuyển đổi sang phân lớp Ngày. Một số phương pháp được giải thích rõ hơn ở chương Làm việc với ngày tháng. Thông thường, tất cả các giá trị ngày ban đầu phải ở cùng một định dạng cần chuyển đổi để có thể sử dụng (ví dụ: “MM/DD/YYYY” hoặc “DD MM YYYY”). Sau khi chuyển đổi thành thành phân lớp Ngày, hãy kiểm tra dữ liệu của bạn để xác nhận rằng mỗi giá trị đã được chuyển đổi chính xác.

Dữ liệu được nhóm

Nếu bộ dữ liệu của bạn đã được nhóm (xem chương Nhóm dữ liệu), hàm

linelist_raw <- import("linelist_raw.xlsx")00 có thể hoạt động khác so với khi bộ dữ liệu không được nhóm. Bất kỳ hàm tổng hợp nào, như

skimr::skim(linelist_raw)37,

skimr::skim(linelist_raw)38,

skimr::skim(linelist_raw)39, v.v. sẽ tính theo nhóm, không phải theo tất cả các hàng.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"9

Đọc thêm về cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")00 trên các bộ dữ liệu được nhóm ở tài liệu về mutate trong package tidyverse.

Biến đổi nhiều cột

Thông thường, để viết mã ngắn gọn, bạn muốn áp dụng cùng một biến đổi trên nhiều cột cùng một lúc. Một cách biến đổi có thể được áp dụng trên nhiều cột cùng một lúc bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")07 từ package dplyr (cũng trong package tidyverse). Hàm

linelist_raw <- import("linelist_raw.xlsx")07 có thể được sử dụng với bất kỳ hàm nào trong packe dplyr, nhưng thường được sử dụng với hàm

linelist_raw <- import("linelist_raw.xlsx")01,

linelist_raw <- import("linelist_raw.xlsx")00,

linelist_raw <- import("linelist_raw.xlsx")08, hoặc

linelist_raw <- import("linelist_raw.xlsx")48. Xem cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")48 trong chương Bảng mô tả.

Chỉ định các cột bằng đối số

skimr::skim(linelist_raw)48 và các hàm được sử dụng bằng

skimr::skim(linelist_raw)49. Bất kỳ đối số bổ sung nào để cung cấp cho hàm

skimr::skim(linelist_raw)50 đều có thể được bao gồm sau dấu phẩy, vẫn nằm trong hàm

linelist_raw <- import("linelist_raw.xlsx")07.

Lựa chọn cột với hàm

linelist_raw <- import("linelist_raw.xlsx")07

Chỉ định các cột tới đối số

skimr::skim(linelist_raw)48. Bạn có thể đặt tên cho chúng một cách riêng lẻ hoặc sử dụng các hàm trợ giúp “tidyselect”. Cụ thể hàm tới đối số

skimr::skim(linelist_raw)49. Lưu ý rằng cách sử dụng hàm được trình bày bên dưới, hàm được viết mà không có dấu ngoặc đơn ().

Ở đây, phép biến đổi

linelist_raw <- import("linelist_raw.xlsx")04 được áp dụng cho tên cột cụ thể trong hàm

linelist_raw <- import("linelist_raw.xlsx")07.

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)0

Các hàm trợ giúp “tidyselect” có sẵn để hỗ trợ bạn trong việc chỉ định các cột. Chúng được trình bày chi tiết ở trên trong mục Chọn và sắp xếp thứ tự cột, bao gồm:

linelist_raw <- import("linelist_raw.xlsx")65,

linelist_raw <- import("linelist_raw.xlsx")73,

linelist_raw <- import("linelist_raw.xlsx")74,

linelist_raw <- import("linelist_raw.xlsx")77,

linelist_raw <- import("linelist_raw.xlsx")79,

linelist_raw <- import("linelist_raw.xlsx")75,

linelist_raw <- import("linelist_raw.xlsx")81,

linelist_raw <- import("linelist_raw.xlsx")83 và

linelist_raw <- import("linelist_raw.xlsx")64.

Đây là một ví dụ về cách thay đổi tất cả các cột thành phân lớp dạng ký tự:

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)1

Chuyển đổi tất cả các cột thành dạng ký tự có tên chứa chuỗi ký tự “date” (lưu ý vị trí của dấu phẩy và dấu ngoặc đơn):

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)2

Dưới đây, một ví dụ về việc thay đổi các cột hiện là phân lớp POSIXct (một kiểu dữ liệu ngày tháng thô hiển thị mốc thời gian) - hay nói cách khác, khi hàm

skimr::skim(linelist_raw)66 đánh giá là

skimr::skim(linelist_raw)67. Sau đó, chúng ta muốn áp dụng hàm

linelist_raw <- import("linelist_raw.xlsx")06 cho các cột này để chuyển đổi chúng thành kiểu Ngày thông thường.

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)3

  • Lưu ý rằng trong hàm

    linelist_raw <- import("linelist_raw.xlsx")07, chúng tôi cũng sử dụng hàm

    linelist_raw <- import("linelist_raw.xlsx")74 tương tự như hàm

    skimr::skim(linelist_raw)71 được đánh giá là TRUE hoặc FALSE.

  • Lưu ý rằng hàm

    skimr::skim(linelist_raw)66 là từ package lubridate. Các hàm “is” tương tự khác như

    skimr::skim(linelist_raw)73,

    skimr::skim(linelist_raw)74, và

    skimr::skim(linelist_raw)75 thì thuộc base R

Hàm

linelist_raw <- import("linelist_raw.xlsx")07

Bạn có thể đọc tài liệu với hàm

skimr::skim(linelist_raw)77 để biết chi tiết về cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")07. Một vài điểm tóm tắt: có một số cách để chỉ định (các) hàm để thực hiện trên một cột và bạn thậm chí có thể tự chỉ định các hàm riêng của mình:

  • Bạn có thể cung cấp tên hàm đứng một mình (ví dụ:

    skimr::skim(linelist_raw)79 hoặc

    skimr::skim(linelist_raw)80)

  • Bạn có thể cung cấp hàm theo phong cách purrr (ví dụ:

    skimr::skim(linelist_raw)81) (xem chương Lặp, vòng lặp, và danh sách)

  • Bạn có thể chỉ định nhiều hàm bằng cách cung cấp danh sách (ví dụ:

    skimr::skim(linelist_raw)82).

    • Nếu bạn cung cấp nhiều hàm, nhiều cột được chuyển đổi sẽ được trả về dựa trên mỗi cột ban đầu, với các tên duy nhất theo định dạng

      skimr::skim(linelist_raw)83. Bạn có thể điều chỉnh cách đặt tên các cột mới với đối số

      skimr::skim(linelist_raw)84 bằng cách sử dụng cú pháp glue (xem chương Ký tự và chuỗi) trong đó

      skimr::skim(linelist_raw)85 và

      skimr::skim(linelist_raw)86 được viết tắt cho cột và hàm đầu vào.

Dưới đây là một số tài nguyên trực tuyến về cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")07: creator Hadley Wickham’s thoughts/rationale

Hàm linelist_raw <- import("linelist_raw.xlsx")17

Hàm dplyr này tìm giá trị không bị thiếu đầu tiên tại mỗi vị trí. Nó “điền vào” các giá trị còn thiếu với giá trị có sẵn đầu tiên theo thứ tự bạn chỉ định.

Đây là một ví dụ ngoài phạm vi của bộ dữ liệu: Giả sử bạn có hai vectơ, một vectơ chứa thông tin về làng nơi bệnh nhân được phát hiện và một vectơ chứa thông tin làng nơi bệnh nhân cư trú . Bạn có thể sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")17 để chọn giá trị không bị thiếu đầu tiên cho mỗi biến số:

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)4

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)5

Điều này hoạt động tương tự nếu bạn cung cấp các cột trong bộ dữ liệu: đối với mỗi hàng, hàm sẽ gán giá trị cột mới với giá trị không bị thiếu đầu tiên trong các cột bạn đã cung cấp (theo thứ tự được cung cấp).

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)6

Đây là một ví dụ về thao tác “theo hàng (row-wise)”. Để biết các phép tính theo hàng phức tạp hơn, hãy xem chương bên dưới về Tính toán theo hàng.

Toán lũy tích

Nếu bạn muốn một cột thể hiện tổng tích lũy/trung bình/tối thiểu/tối đa, v.v. như đánh giá các hàng của bộ dữ liệu cho đến thời điểm đó, hãy sử dụng các hàm sau:

skimr::skim(linelist_raw)90 trả về tổng tích lũy, như được hiển thị bên dưới:

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)7

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)8

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)9

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"0

Điều này có thể được sử dụng trong bộ dữ liệu khi tạo một cột mới. Ví dụ: để tính toán số ca lũy tích mỗi ngày trong một đợt bùng dịch, hãy xem xét đoạn code như sau:

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"1

Dưới đây là 10 hàng đầu tiên:

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"2

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"3

Xem chương Đường cong dịch bệnh để biết cách lập biểu đồ các trường hợp mới mắc tích lũy với epicurve.

Xem thêm:

skimr::skim(linelist_raw)90,

skimr::skim(linelist_raw)92,

skimr::skim(linelist_raw)93,

skimr::skim(linelist_raw)94,

skimr::skim(linelist_raw)95,

skimr::skim(linelist_raw)96

Sử dụng base R

Để định nghĩa một cột mới (hoặc tái định nghĩa lại một cột) bằng cách sử dụng base R, hãy viết tên của bộ dữ liệu, được liên kết với

skimr::skim(linelist_raw)97, vào tên cột mới (hoặc cột được sửa đổi). Sử dụng toán tử gán

skimr::skim(linelist_raw)98 để xác định (các) giá trị mới. Hãy nhớ rằng khi sử dụng base R, bạn phải chỉ định tên bộ dữ liệu trước tên cột (ví dụ:

skimr::skim(linelist_raw)99). Đây là một ví dụ về cách tạo cột

skimr::skim(linelist_raw)20 bằng cách sử dụng base R:

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"4

Thêm vào chuỗi pipe

Dưới đây, một cột mới được thêm vào chuỗi pipe và một số phân lớp được chuyển đổi.

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"5

Dưới đây là một số tình huống mà bạn cần mã hóa lại (thay đổi) các giá trị:

  • để chỉnh sửa một giá trị cụ thể (ví dụ: một ngày có năm hoặc định dạng không chính xác)
  • để hợp nhất các giá trị được viết sai chính tả
  • để tạo một cột chứa giá trị phân loại mới
  • để tạo một cột chứa danh mục số mới (ví dụ: danh mục độ tuổi)

Giá trị cụ thể

Để thay đổi các giá trị theo cách thủ công, bạn có thể sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")13 bên trong hàm

linelist_raw <- import("linelist_raw.xlsx")00.

Hãy tưởng tượng có một ngày không bình thường trong dữ liệu (ví dụ: “2014-14-15”): bạn có thể sửa ngày theo cách thủ công trong dữ liệu thô hoặc, bạn có thể ghi thay đổi trong chuỗi các bước làm sạch thông qua

linelist_raw <- import("linelist_raw.xlsx")00 và

linelist_raw <- import("linelist_raw.xlsx")13. Cách thứ hai sẽ rõ ràng hơn và có thể được tái lập lại cho bất kỳ ai khác muốn hiểu hoặc lặp lại phân tích của bạn.

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"6

Dòng

linelist_raw <- import("linelist_raw.xlsx")00 ở trên có thể được đọc là: “biến đổi cột

linelist_raw <- import("linelist_raw.xlsx")66 bằng với cột

linelist_raw <- import("linelist_raw.xlsx")66 sau khi được mã hóa lại để GIÁ TRỊ CŨ được đổi thành GIÁ TRỊ MỚI”. Lưu ý rằng cú pháp (CŨ = MỚI) này của hàm

linelist_raw <- import("linelist_raw.xlsx")13 ngược lại với hầu hết các cú pháp trong R (mới = cũ). Cộng đồng phát triển R đang làm việc để sửa đổi điều này.

Sau đây là một ví dụ khác về việc mã hóa lại nhiều giá trị trong một cột.

Trong bộ dữ liệu

linelist_raw <- import("linelist_raw.xlsx")25, các giá trị trong cột “hospital” phải được làm sạch. Có một số cách viết khác nhau và nhiều giá trị bị thiếu.

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"7

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"8

Lệnh

linelist_raw <- import("linelist_raw.xlsx")13 bên dưới tái định nghĩa lại cột “hospital” theo cột hiện tại “hospital”, nhưng với các thay đổi mã hóa được chỉ định. Đừng quên dấu phẩy sau mỗi dòng mã hóa lại!

## [1] "case_id" "generation" "infection_date" "date_onset" "hosp_date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"9

Bây giờ chúng ta thấy các cách viết trong cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"11 đã được sửa chữa và hợp nhất:

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)0

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)1

MẸO: Số lượng khoảng trắng trước và sau dấu bằng không quan trọng. Hãy làm cho code của bạn dễ đọc hơn bằng cách căn chỉnh dấu = cho tất cả hoặc hầu hết các hàng. Ngoài ra, hãy cân nhắc thêm hàng bình luận để làm rõ cho người đọc biết bên nào CŨ và bên nào MỚI.

MẸO: Đôi khi tồn tại một giá trị ký tự trống trong bộ dữ liệu (không được nhận dạng là giá trị missing của R -

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12). Bạn có thể tham chiếu giá trị này bằng hai dấu ngoặc kép không có khoảng trắng ở giữa ("").

Theo logic

Dưới đây, chúng ta trình bày cách mã hóa lại các giá trị trong một cột bằng cách sử dụng logic và điều kiện:

  • Sử dụng hàm

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"13,

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"14 và

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"15 cho logic đơn giản

  • Sử dụng hàm

    linelist_raw <- import("linelist_raw.xlsx")14 cho logic phức tạp

Logic đơn giản

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"17

Để mã hóa lại với các tiêu chí logic đơn giản, bạn có thể sử dụng hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"13 bên trong hàm

linelist_raw <- import("linelist_raw.xlsx")00.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"13 là một hàm từ base R. Sử dụng một điều kiện logic để cụ thể các hàng cần thay đổi. Cú pháp chung là:

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"21.

Một tình huống phổ biến để sử dụng

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"13 là chỉ thay đổi một giá trị trong một hàng, bằng cách sử dụng định danh hàng duy nhất. Dưới đây, giới tính được thay đổi thành “Female” trong hàng mà cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"23 có giá trị là “2195”.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)2

Lệnh tương tự sử dụng cú pháp trong base R và dấu ngoặc vuông [] ở bên dưới. Nó có nội dung là “Thay đổi giá trị của cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"24 trong bộ dữ liệu

linelist_raw <- import("linelist_raw.xlsx")25 (đối với các hàng mà cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"23 của

linelist_raw <- import("linelist_raw.xlsx")25 có giá trị ‘2195’) thành ‘Female’”.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)3

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"28 và

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"15

Một cách khác áp dụng cho logic đơn giản là hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"14 và hàm tương tự là

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"15. Tuy nhiên, trong hầu hết các trường hợp để mã hóa lại, cách rõ ràng hơn là sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")14 (chi tiết bên dưới). Câu lệnh “if else” này là các phiên bản đơn giản hóa của câu lệnh lập trình

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"33 và

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"34. Cú pháp chung là:

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"35

Dưới đây, cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"36 được định nghĩa. Giá trị của nó trong một hàng được đặt thành “known” nếu giá trị của hàng trong cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"37 không bị thiếu. Nếu thiếu giá trị trong cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"37, thì giá trị trong

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"36 được đặt thành “unknown”.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)4

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"15 là một phiên bản đặc biệt từ package dplyr để xử lý ngày tháng. Lưu ý rằng nếu giá trị ‘true’ là một ngày thì giá trị ‘false’ cũng phải đủ điều kiện là một ngày, do đó sử dụng giá trị đặc biệt

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"41 thay vì chỉ

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)5

Tránh lồng ghép nhiều lệnh ifelse với nhau… thay vào đó hãy sử dụng

linelist_raw <- import("linelist_raw.xlsx")14!

linelist_raw <- import("linelist_raw.xlsx")14 dễ đọc hơn và bạn sẽ mắc ít lỗi hơn.

Tại sao dùng câu lệnh bysort trong stata

Ngoài phạm vi của bộ dữ liệu, nếu bạn muốn một đối tượng được sử dụng trong code của mình chuyển đổi giá trị của nó, hãy xem xét sử dụng hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"45 từ base R.

Logic phức tạp

Sử dụng

linelist_raw <- import("linelist_raw.xlsx")14 của package dplyr nếu bạn đang mã hóa lại thành nhiều nhóm mới hoặc nếu bạn cần sử dụng các câu lệnh logic phức tạp để mã hóa lại các giá trị. Hàm này đánh giá mọi hàng trong bộ dữ liệu, đánh giá xem các hàng có đáp ứng các tiêu chí đã chỉ định hay không và chỉ định giá trị mới chính xác.

Câu lệnh

linelist_raw <- import("linelist_raw.xlsx")14 bao gồm hai cấu phần là Bên tay Phải (RHS) và Bên tay Trái (LHS) được phân tách bằng “dấu ngã”

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"48. Các tiêu chí logic nằm ở phía bên trái và các giá trị tương ứng nằm ở phía bên phải của mỗi mệnh đề. Các mệnh đề được phân tách bằng dấu phẩy.

Ví dụ: chúng tôi sử dụng cột

skimr::skim(linelist_raw)28 và

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"50 để tạo cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"51:

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)6

Khi mỗi hàng trong dữ liệu được đánh giá, các tiêu chí được áp dụng/đánh giá theo thứ tự đã viết trong

linelist_raw <- import("linelist_raw.xlsx")14 - từ trên xuống dưới. Nếu tiêu chí hàng đầu đánh giá là

skimr::skim(linelist_raw)67 cho một hàng nhất định, giá trị Bên tay phải sẽ được chỉ định và các tiêu chí còn lại thậm chí không được kiểm tra cho hàng đó. Vì vậy, tốt nhất là bạn nên viết các tiêu chí cụ thể nhất trước và cuối cùng là tiêu chí chung chung.

Dọc theo những dòng đó, trong mệnh đề cuối cùng của bạn, hãy đặt

skimr::skim(linelist_raw)67 ở phía bên trái để ghi lại bất kỳ hàng nào không đáp ứng bất kỳ tiêu chí nào trước đó. Phía bên phải của câu lệnh này có thể được gán một giá trị như “kiểm tra tôi! (check me)” hoặc missing.

NGUY HIỂM: Các giá trị ở phía bên phải đều phải cùng một phần lớp - số, ký tự, ngày tháng, lôgic, v.v. Để gán giá trị thiếu (NA), bạn có thể cần sử dụng các biến thể đặc biệt của

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12 như

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"56,

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"41 (cho số hoặc POSIX) và

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"58. Đọc thêm trong chương Làm việc với ngày tháng.

Giá trị missing

Dưới đây là các hàm đặc biệt để xử lý các giá trị bị thiếu trong khi làm sạch dữ liệu.

Xem chương về Dữ liệu Missing để biết thêm các mẹo chi tiết về xác định và xử lý các giá trị bị thiếu. Ví dụ, hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"59 kiểm tra một cách logic sự thiếu giá trị.

linelist_raw <- import("linelist_raw.xlsx")15

Để thay đổi các giá trị bị thiếu (

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12) thành một giá trị cụ thể, chẳng hạn như “Missing”, hãy sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")15 trong hàm

linelist_raw <- import("linelist_raw.xlsx")00 trong package dplyr. Lưu ý rằng điều này được sử dụng theo cách tương tự như hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"64 ở trên - tên của biến phải được lặp lại trong

linelist_raw <- import("linelist_raw.xlsx")15.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)7

fct_explicit_na()

Đây là một hàm từ package forcats. Package forcats xử lý các cột dạng Factor. Factor là cách của R để xử lý các giá trị có thứ tự như

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"66 hoặc để thiết lập thứ tự cho các giá trị (ví dụ: bệnh viện) xuất hiện trong bảng và biểu đồ. Xem chương Factors.

Nếu dữ liệu của bạn là kiểu Factor và bạn đang cố gắng chuyển giá trị

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12 thành “Missing” bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")15, bạn sẽ gặp lỗi này:

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"69. Bạn đã cố gắng thêm “Missing” làm giá trị, trong khi nó đã không được xác định là một thứ bậc trong cột Factor, và câu lệnh bị từ chối.

Cách dễ nhất để giải quyết vấn đề này là sử dụng hàm forcats

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"70 để chuyển đổi một cột thành kiểu Factor và chuyển đổi các giá trị

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12 thành ký tự “(Missing)”.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)8

Một giải pháp thay thế chậm hơn sẽ là thêm thứ bậc cho cột Factor bằng cách sử dụng hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"72 và sau đó chuyển đổi các giá trị bị thiếu.

linelist_raw <- import("linelist_raw.xlsx")16

Để chuyển đổi một giá trị cụ thể thành

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12, hãy sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")16 trong package dplyr. Hàm này thực hiện thao tác ngược lại với hàm

linelist_raw <- import("linelist_raw.xlsx")15. Trong ví dụ bên dưới, bất kỳ giá trị nào bị “Missing” trong cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"11 đều được chuyển đổi thành

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12.

# CLEANING 'PIPE' CHAIN (starts with raw data and pipes it through cleaning steps) ################################################################################## linelist <- linelist_raw %>% # standardize column name syntax janitor::clean_names() %>% # manually re-name columns # NEW name # OLD name rename(date_infection = infection_date, date_hospitalisation = hosp_date, date_outcome = date_of_outcome)9

Lưu ý:

linelist_raw <- import("linelist_raw.xlsx")16 không thể sử dụng cho điều kiện logic (ví dụ: “all values > 99”) - hãy sử dụng

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"13 hoặc

linelist_raw <- import("linelist_raw.xlsx")14 cho điều này:

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"0

Từ điển làm sạch

Sử dụng package linelist trong R và hàm

linelist_raw <- import("linelist_raw.xlsx")20 để làm sạch bộ dữ liệu bằng từ điển làm sạch. linelist là một package được phát triển bởi RECON - R Epidemics Consortium.

  1. Tạo từ điển làm sạch với 3 cột:

    • Cột “từ” (giá trị không chính xác)
    • Cột “tới” (giá trị chính xác)
    • Một cột chỉ định cột cho các thay đổi sẽ được áp dụng (hoặc “.global” để áp dụng cho tất cả các cột)

Lưu ý: các mục từ điển .global sẽ bị ghi đè bởi các mục từ điển theo cột cụ thể.

Tại sao dùng câu lệnh bysort trong stata
  1. Nạp tệp từ điển vào R. Ví dụ này có thể được tải xuống theo hướng dẫn trong chương Tải sách và dữ liệu.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"1

  1. Chuyển bộ dữ liệu linelist ban đầu đến hàm

    linelist_raw <- import("linelist_raw.xlsx")20, xác định

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"84 là bộ dữ liệu từ điển làm sạch. Đối số

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"85 có thể được sử dụng để chỉ định cột nào trong từ điển tham chiếu đến các cột khác (cột thứ 3 theo mặc định) hoặc có thể được đặt thành

    skimr::skim(linelist_raw)00 để từ điển áp dụng cho tất cả các cột dạng ký tự và phân loại. Lưu ý rằng hàm này có thể mất nhiều thời gian để chạy.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"2

Bây giờ, hãy cuộn sang bên phải để xem các giá trị đã thay đổi như thế nào - đặc biệt là

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"24 (chữ thường thành chữ hoa) và tất cả các cột triệu chứng đã được chuyển từ có/không thành 1/0.

Lưu ý rằng tên cột của bạn trong từ điển làm sạch phải tương ứng với tên tại thời điểm trong script làm sạch của bạn. Xem tài liệu tham khảo trực tuyến về package linelist để biết thêm chi tiết.

Thêm vào chuỗi làm sạch

Dưới đây, một số cột mới và biến đổi cột được thêm vào chuỗi các bước làm sạch.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"3

Thêm từng hàng một

Việc thêm từng hàng một theo cách thủ công là rất nhàm chán nhưng có thể được thực hiện với hàm

linelist_raw <- import("linelist_raw.xlsx")11 từ package dplyr. Hãy nhớ rằng mỗi cột chỉ được chứa các giá trị của một phân lớp (ký tự, số, lôgic, v.v.). Vì vậy, khi thêm một hàng cần chú ý tới điều này.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"4

Sử dụng

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"89 và

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"90 để cụ thể vị trí của hàng bạn muốn thêm.

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"91 sẽ cho phép hàng mới được thêm trước hàng thứ 3 hiện tại. Mặc định thì hàng sẽ được thêm vào dòng cuối cùng. Các cột không được chỉ định sẽ được để trống (

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12).

Số thứ tự hàng mới có thể trông lạ (“… 23”) nhưng số thứ tự hàng trong các hàng tồn tại trước đó đã thay đổi. Vì vậy, nếu sử dụng lệnh hai lần, hãy kiểm tra/thử việc chèn một cách cẩn thận.

Nếu một phân lớp bạn cung cấp không hoạt động, bạn sẽ thấy báo lỗi như sau:

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"5

(khi chèn một hàng có giá trị ngày tháng, hãy nhớ đặt thông tin

linelist_raw <- import("linelist_raw.xlsx")06 ví dụ như

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"94).

Nối các hàng

Để kết hợp các bộ dữ liệu với nhau bằng cách liên kết các hàng của một bộ dữ liệu này với phần cuối bộ dữ liệu khác, bạn có thể sử dụng hàm

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"95 từ dplyr. Điều này được giải thích chi tiết hơn trong chương Nối dữ liệu.

Bước làm sạch điển hình sau khi bạn đã làm sạch các cột và các giá trị được mã hóa lại đó là lọc bộ dữ liệu cho các hàng cụ thể bằng cách sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")08 trong package dplyr.

Trong hàm

linelist_raw <- import("linelist_raw.xlsx")08, hãy cụ thể điều kiện logic phải là giá trị

skimr::skim(linelist_raw)67 cho một hàng được giữ trong bộ dữ liệu. Dưới đây chúng tôi trình bày cách lọc hàng dựa trên điều kiện logic đơn giản và phức tạp.

Lọc đơn giản

Ví dụ đơn giản này định nghĩa lại bộ dữ liệu

linelist_raw <- import("linelist_raw.xlsx")25, đã lọc các hàng để đáp ứng điều kiện logic. Chỉ những hàng mà câu lệnh logic trong dấu ngoặc đơn đánh giá là

skimr::skim(linelist_raw)67 mới được giữ lại.

Trong ví dụ này, câu lệnh logic là

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)01, được hỏi liệu giá trị trong cột

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"24 có bằng “f” (phân biệt chữ hoa chữ thường) hay không.

Trước khi bộ lọc được áp dụng, số hàng trong

linelist_raw <- import("linelist_raw.xlsx")25 là

skimr::skim(linelist_raw)09.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"6

Sau khi bộ lọc được áp dụng, số hàng trong

linelist_raw <- import("linelist_raw.xlsx")25 là

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)06.

Lọc bỏ các giá trị missing

Một điều khá phổ biến là bạn muốn lọc bỏ các hàng có giá trị missing. Hãy bỏ qua cách lọc cổ điển

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)07 và thay vào đó, hãy sử dụng hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)08 trong package tidyr được xây dựng để tùy chỉnh cho mục đích này. Nếu chạy với dấu ngoặc trống, nó sẽ loại bỏ các hàng có bất kỳ giá trị nào bị missing. Ngoài ra, bạn có thể cung cấp tên của các cột cụ thể sẽ được đánh giá về mức độ missing hoặc sử dụng các hàm trợ giúp “tidyselect” như được mô tả ở trên.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"7

Xem chương về Dữ liệu Missing để biết nhiều kỹ thuật phân tích và quản lý dữ liệu missing.

Lọc bằng số thứ tự của hàng

Trong một data frame hoặc tibble, mỗi hàng thường sẽ có một “số thứ tự” (khi xem trong R Viewer) xuất hiện ở bên trái của cột đầu tiên. Bản thân nó không phải là một cột trong dữ liệu, nhưng nó có thể được sử dụng trong câu lệnh

linelist_raw <- import("linelist_raw.xlsx")08.

Để lọc dựa trên “số thứ tự của hàng”, bạn có thể sử dụng hàm dplyr

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)10 với “dấu ngoặc đơn mở” như một phần của câu lệnh lọc logic. Thường thì bạn sẽ sử dụng toán tử

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)11 và một dãy số như một phần của câu lệnh logic đó, như được trình bày bên dưới. Để xem N hàng đầu tiên, bạn cũng có thể sử dụng hàm đặc biệt

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)12 trong package dplyr.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"8

Bạn cũng có thể chuyển đổi số thứ tự hàng thành cột bằng cách sử dụng hàm tibble

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)13 (không viết bất kỳ ký tự nào trong dấu ngoặc đơn).

Lọc phức tạp

Các câu lệnh logic phức tạp hơn có thể được xây dựng bằng cách sử dụng các toán tử ngoặc đơn

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)14, HOẶC

linelist_raw <- import("linelist_raw.xlsx")90, PHỦ ĐỊNH

linelist_raw <- import("linelist_raw.xlsx")88,

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)11, và VÀ

linelist_raw <- import("linelist_raw.xlsx")89. Dưới đây là một ví dụ:

Lưu ý: Bạn có thể sử dụng

linelist_raw <- import("linelist_raw.xlsx")88 trước một mệnh đề logic để phủ định nó. Ví dụ,

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)20 trả về giá trị TRUE nếu cột đó không bị thiếu giá trị. Tương tự như vậy

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)21 trả về kết quả là TRUE nếu giá trị cột không có trong vectơ.

Kiểm tra dữ liệu

Dưới đây là một dòng lệnh đơn giản để tạo biểu đồ các ngày bắt đầu. Chúng ta thấy rằng có một đợt bùng phát nhỏ thứ hai từ năm 2012-2013 cũng được bao gồm trong tập bộ liệu thô này. Trong các phân tích, chúng ta muốn xóa các bản ghi từ đợt bùng phát sớm.

## [1] "case_id" "generation" "date_infection" "date_onset" "date_hospitalisation" "date_outcome" ## [7] "outcome" "gender" "hospital" "lon" "lat" "infector" ## [13] "source" "age" "age_unit" "row_num" "wt_kg" "ht_cm" ## [19] "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "x28"9

Tại sao dùng câu lệnh bysort trong stata

Cách lọc và xử lý các giá trị số và ngày bị missing

Chúng ta có thể chỉ lọc theo

linelist_raw <- import("linelist_raw.xlsx")66 đến những hàng sau tháng 6 năm 2013 không? Lưu ý! Việc áp dụng code

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)23 sẽ xóa bất kỳ hàng nào trong đợt dịch sau đó có ngày bắt đầu bị thiếu!

NGUY HIỂM: Việc lọc với điều kiện lớn hơn (>) hoặc nhỏ hơn (<) một ngày hoặc số có thể loại bỏ bất kỳ hàng nào có giá trị bị thiếu (

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12)! Điều này là do

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"12 được coi là giá trị lớn hoặc nhỏ vô hạn.

(Xem chương Làm việc với ngày tháng để biết thêm thông tin về cách xử lý với ngày tháng và package lubridate)

Thiết kế bộ lọc

Lập một bảng chéo để đảm bảo rằng chúng ta chỉ loại bỏ các hàng cần loại bỏ:

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)0

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)1

Liệu chúng ta có thể lọc theo tiêu chí nào khác để loại bỏ đợt bùng phát đầu tiên (trong năm 2012 & 2013) khỏi bộ dữ liệu? Chúng ta thấy rằng:

  • Vụ dịch đầu tiên năm 2012 & 2013 xảy ra tại Hospital A, Hospital B, tại Port Hospital cũng có 10 trường hợp mắc.
  • Hospital A & B không có ca bệnh nào trong đợt dịch thứ hai, nhưng Port Hospital thì có.

Chúng ta muốn loại bỏ:

Chúng ta bắt đầu với

linelist_raw <- import("linelist_raw.xlsx")25 bằng câu lệnh

skimr::skim(linelist_raw)09. Đây là toàn bộ câu lệnh lọc của chúng ta:

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)2

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)3

Khi chúng ta lập lại bảng chéo, chúng ta thấy rằng Hospital A & B bị loại bỏ hoàn toàn, và 10 trường hợp của Port Hospital từ năm 2012 & 2013 bị loại bỏ và tất cả các giá trị khác đều tương tự - đúng như ý chúng ta muốn.

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)0

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)5

Nhiều biểu thức có thể được bao hàm trong một lệnh lọc (được phân tách bằng dấu phẩy) hoặc bạn luôn có thể viết chúng riêng biệt và nối tiếp nhau trong chuỗi các bước làm sạch để rõ ràng hơn.

Ghi chú: một số độc giả có thể nhận thấy rằng sẽ dễ dàng hơn nếu chỉ lọc theo

linelist_raw <- import("linelist_raw.xlsx")67 vì nó hoàn chỉnh 100% mà không có giá trị nào bị thiếu. Đây là sự thật. Nhưng

linelist_raw <- import("linelist_raw.xlsx")66 được sử dụng cho mục đích thể hiện sự phức tạp của việc lọc.

Độc lập

Việc lọc cũng có thể được thực hiện như một lệnh độc lập (không phải là một phần của chuỗi các bước làm sạch). Giống như các hàm dplyr khác, trong trường hợp này, đối số đầu tiên phải chính là bộ dữ liệu.

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)6

Bạn cũng có thể sử dụng base R để chia nhỏ dữ liệu bằng cách sử dụng dấu ngoặc đểm tham chiếu tới [hàng, cột] mà bạn muốn giữ lại.

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)7

Xem nhanh các bản ghi

Thường thì bạn muốn xem nhanh một vài bản ghi, chỉ cho một vài cột. Hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)30 trong base R sẽ hiển thị một khung dữ liệu để xem trong RStudio.

Xem

linelist_raw <- import("linelist_raw.xlsx")25 trong RStudio:

Dưới đây là hai ví dụ về việc xem các ô cụ thể (hàng cụ thể và cột cụ thể):

Với hàm

linelist_raw <- import("linelist_raw.xlsx")08 và

linelist_raw <- import("linelist_raw.xlsx")01 trong dplyr:

Với hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)30, chuyển tiếp bộ dữ liệu đến hàm

linelist_raw <- import("linelist_raw.xlsx")08 để giữ các hàng nhất định và sau đó

linelist_raw <- import("linelist_raw.xlsx")01 để giữ các cột nhất định. Ví dụ, để xem xét ngày khởi phát và nhập viện của 3 trường hợp cụ thể:

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)8

Bạn có thể đạt được điều tương tự với cú pháp trong base R, sử dụng dấu ngoặc

linelist_raw <- import("linelist_raw.xlsx")23 cho tập hợp con bạn muốn xem.

rename(newNameForFirstColumn = 1, newNameForSecondColumn = 2)9

Thêm vào chuỗi làm sạch

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)0

Nếu bạn muốn thực hiện một phép tính trong một hàng, bạn có thể sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")10 từ dplyr. Xem chi tiết tại row-wise calculations.
Ví dụ: code này sử dụng hàm

linelist_raw <- import("linelist_raw.xlsx")10 và sau đó tạo một cột mới là tổng số cột triệu chứng được chứa giá trị “có”, cho mỗi hàng trong

linelist_raw <- import("linelist_raw.xlsx")25. Các cột được cụ thể trong hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)41 theo tên trong vectơ

linelist_raw <- import("linelist_raw.xlsx")86. Hàm

linelist_raw <- import("linelist_raw.xlsx")10 về cơ bản là một hình thức

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)44 đặc biệt, vì vậy tốt nhất bạn nên sử dụng

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)45 khi bạn hoàn tất (trong chương Nhóm dữ liệu).

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)1

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)2

Khi bạn chỉ định cột để đánh giá, bạn có thể muốn sử dụng các hàm trợ giúp “tidyselect” như được mô tả trong mục

linelist_raw <- import("linelist_raw.xlsx")01 của chương này. Bạn chỉ cần thực hiện một điều chỉnh (vì bạn đang không sử dụng chúng bên trong một hàm của dplyr như

linelist_raw <- import("linelist_raw.xlsx")01 hoặc

linelist_raw <- import("linelist_raw.xlsx")48).

Đặt tiêu chí đặc tả cột trong hàm dplyr là

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)49. Điều này là do hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)50 (tài liệu) được thiết kế để hoạt động cụ thể với hàm

linelist_raw <- import("linelist_raw.xlsx")10. Ví dụ, như đoạn code sau:

  • Áp dụng

    linelist_raw <- import("linelist_raw.xlsx")10 nên bước tiếp theo (

    # pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)41) được áp dụng trong mỗi hàng (không tính tổng toàn bộ các cột)

  • Tạo cột mới

    # pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)54, được xác định cho mỗi hàng là số cột (có tên chứa “ngày tháng”) mà

    ## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"59 trả về giá trị TRUE (nghĩa là chúng bị thiếu dữ liệu)

  • # pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)45 để loại bỏ ảnh hưởng của

    linelist_raw <- import("linelist_raw.xlsx")10 cho các bước tiếp theo

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)3

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)4

Bạn cũng có thể cung cấp các hàm khác, chẳng hạn như

skimr::skim(linelist_raw)39 để lấy ngày mới nhất hoặc gần đây nhất cho mỗi hàng:

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)5

linelist_raw %>% select(# NEW name # OLD name date_infection = `infection date`, # rename and KEEP ONLY these columns date_hospitalisation = `hosp date`)6

Sử dụng hàm dplyr

linelist_raw <- import("linelist_raw.xlsx")12 để sắp xếp thứ tự các hàng theo giá trị cột.

Đơn giản hãy liệt kê các cột theo thứ tự mà chúng cần được sắp xếp. Thêm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)60 nếu bạn muốn việc sắp xếp xảy ra trước bất kỳ hành động nhóm dữ liệu nào được áp dụng trong dữ liệu (xem chương Nhóm dữ liệu).

Mặc định, cột sẽ được sắp xếp theo thứ tự “tăng dần” (áp dụng cho cột số và cả cột ký tự). Bạn có thể sắp xếp một biến theo thứ tự “giảm dần” bằng cách đặt tên biến trong hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)61.

Việc sắp xếp dữ liệu với hàm

linelist_raw <- import("linelist_raw.xlsx")12 đặc biệt hữu ích khi Trình bày bảng, sử dụng hàm

# pipe the raw dataset through the function clean_names(), assign result as "linelist" linelist <- linelist_raw %>% janitor::clean_names() # see the new column names names(linelist)63 để lấy các hàng “trên cùng” trên mỗi nhóm hoặc thiết lập thứ tự danh mục theo thứ tự xuất hiện.

Ví dụ: để sắp xếp các hàng trong

linelist_raw <- import("linelist_raw.xlsx")25 theo

## [1] "case_id" "generation" "infection date" "date onset" "hosp date" "date_of_outcome" "outcome" "gender" ## [9] "hospital" "lon" "lat" "infector" "source" "age" "age_unit" "row_num" ## [17] "wt_kg" "ht_cm" "ct_blood" "fever" "chills" "cough" "aches" "vomit" ## [25] "temp" "time_admission" "merged_header" "...28"11, sau đó theo

linelist_raw <- import("linelist_raw.xlsx")66 thứ tự giảm dần, chúng ta sẽ thực hiện như sau: