Lệnh trong R – Tạo biến điều kiện

Sáng giờ ngồi mày mò tìm lỗi trong một đoạn code R, mặc dù không tìm ra chính xác lỗi là gì nhưng phát hiện một cách để có thể đi tiếp thay vì giậm chân tại chỗ.

Mình đang học khóa “Linear Regression in R for Public Health” trên coursera, các bộ dữ liệu và câu lệnh dưới đây là theo hướng dẫn của khóa học. Các câu lệnh trong bài này mình viết lại từ hướng dẫn của khóa học.

Bộ dữ liệu mình đang thực hành tên COPD, chứa các thông tin liên quan đến bệnh nhân mắc bệnh COPD (Bệnh phổi tắc nghẹn mãn tính), như là giới tính (ký hiệu hoặc tên biến là gender), chức năng phổi (FEV1 và FVC), chỉ số khoảng cách đi bộ trong vòng 6 phút (MWT), tuổi tác (AGE), mức độ bệnh COPD (COPDSEVERITY), chất lượng sống (SGRQ), và tình trạng mắc các bệnh đi kèm như tiểu đường (Diabetes), tim mạch vành (muscular), cao huyết áp (hypertension), rối loạn nhịp tim (AtrialFib), bệnh tim thiếu máu cục bộ (IHD)…

Đề bài là tạo thêm một biến về bệnh đi kèm nói chung (comorbidity), biến này sẽ phân giá trị 1 (có mắc) cho bệnh nhân nào mắc ít nhất một trong các bệnh đi kèm kể trên và giá trị 0 (không mắc) cho những bệnh nhân còn lại (không mắc bất cứ bệnh đi kèm nào).

Đầu tiên ta cần tạo biến và đặt tên cho biến, ta đặt tên là “comorbid”. Do ta cần dữ liệu comorbid cho tổng số lượng bệnh nhân có trong bộ dữ liệu (tổng số bệnh nhân = 101) nên ta sẽ cho R biết là biến này có độ dài (hay tổng số thành phần) cũng bằng 101. Do các biến bệnh đi kèm cũng có 101 bệnh nhân, nên ta có thể cho độ dài của biến comorbid bằng với độ dài của bất cứ bệnh đi kèm nào.

VD: comorbid <- length (COPD$Diabetes)

Dấu “$” chỉ Diabetes là biến của bộ dữ liệu COPD, dấu “<-” tương tự như dấu “=” mình hay dùng, và dùng dấu nào cũng được. VD: x <-/= 1, nghĩa là ta phân giá trị 1 cho x

Tiếp theo, ta cần tạo điều kiện đầu tiên: phân giá trị 1 cho bệnh nhân nào mắc một hoặc nhiều hơn các bệnh đi kèm:

comorbid[COPD$Diabetes == 1 | COPD$muscular ==1 | COPD$hypertension == 1 | COPD$AtrialFib ==1 | COPD$IHD ==1] <- 1

Dấu “|” mang nghĩa là “hoặc”. Dòng lệnh trên có nghĩa là ta phân giá trị 1 cho biến comorbid khi biến Diabetes = 1 (bệnh nhân có mắc bệnh), hoặc muscular = 1, hoặc hypertension = 1, hoặc AtrialFib = 1, hoặc IHD = 1.

Kế đến ta cần tạo điều kiện thứ hai cho biến comorbid, những bệnh nhân còn lại không mắc bất cứ bệnh đi kèm nào sẽ có giá trị là 0. Khóa học trên coursera hướng dẫn mình dùng câu lệnh:

comorbid[is.na(comorbid)] <- 0

Lệnh này có nghĩa là phân giá trị 0 cho các phần tử “NA”, mà theo coursera hướng dẫn là các giá trị NA trong biến này. Mà mình bị lăn tăn, NA là có thể là do không có thông tin (như khi thu thập bị thiếu một bệnh nhân nào đó không có thông tin mắc một bệnh nào đó), hoặc NA là không áp với điều kiện nói ở trên. Vấn đề xuất phát từ sự lăn tăn này. Vì mới đầu mình không nghĩ sẽ dùng câu lệnh is.na. Khi nghĩ đến điều kiện, nếu là a/b/c thì giá trị 1, không thì giá trị 0, thì mình nghĩ ngay đến ifelse, câu lệnh của mình như sau, và chạy ra cũng y như câu lệnh được hướng dẫn:

comorbid = ifelse (COPD$Diabetes == 1 | COPD$muscular ==1 | COPD$hypertension == 1 | COPD$AtrialFib ==1 | COPD$IHD ==1, 1, 0)

Mà thôi kệ, nếu lệnh trong hướng dẫn ra đúng thì NA ở đây có nghĩa là các giá trị còn lại không ứng với điều kiện trong câu đầu tiên (phân giá trị 1 cho bệnh nhân mắc một trong các bệnh đi kèm), dù sao câu này cũng ngắn hơn, mà chắc mình sẽ khó nhớ hơn tại không phải do mình tự viết.

Trước khi mình chạy thử câu lệnh mình tự nghĩ ifelse, thì mình ngồi mò xem code mình viết có gì khác với code trong coursera. Thì mình có tài lanh là thay vì câu is.na, mình lại tạo ra một biến điều kiện khác tương tự như biến điều kiện 1 (phân giá trị 1)

comorbid[COPD$Diabetes == 0 | COPD$muscular == 0 | COPD$hypertension == 0 | COPD$AtrialFib == 0 | COPD$IHD == 0] <- 0 (1)

Haha, thoạt nhìn cũng hợp lý mà, nhưng chắc vì biến này có 2 giá trị 1 hoặc 0 nên mình không thể ghi song song như vậy trên cùng một tên biến. Nên rốt cuộc là bị lỗi, cụ thể là khi mình xem các giá trị trong biến comorbid thì chỉ toàn là giá trị 0. Bây giờ thì mình hơi hiểu tại sao nó là như vậy.

Trước khi ghi câu lệnh này thì mình có xóa đi câu lệnh bằng cách bấm dấu mũi tên đi lên trên bàn phím, và chạy lại câu lệnh

comorbid[COPD$Diabetes == 1 | COPD$muscular ==1 | COPD$hypertension == 1 | COPD$AtrialFib ==1 | COPD$IHD ==1] <- 1

Lúc này thì nó lại hiện ra cảnh báo là không có giá trị “na” hợp lý.

Lý do mình nghĩ là do mình đã gắn giá trị cho comorbid bằng câu lệnh (1), nên nó bị gắn luôn với điều kiện đó, và khi mình xóa câu lệnh đi thì biến đó và điều kiện đó vẫn còn, nên nó bị trùng lắp.

Sau một hồi suy nghĩ, thì mình đã tìm ra cách: đó là xóa bỏ biến comorbid (a) cũng như cột comorbid trong bộ dữ liệu COPD (b).

(a) là một biến bất kì mình tạo trong working space của R, nếu muốn đưa biến (a) vào COPD trở thành (b) ta phải viết thêm câu lệnh, coi như thêm một cột vào COPD, chứ không tự nhiên mà nó thêm vào:

COPD$comorbid = comorbid

Vậy là mình cần phải xóa chắc chắn là (b), còn (a) không biết có cần xóa không, nhưng cứ xóa cho chắc.

Xóa (a) tương đối dễ, mình sử dụng lệnh remove hay rm

rm(comorbid)

Với (b) thì phải làm thêm vài bước theo hướng dẫn tại đây:

Đầu tiên là tải về và mở bộ “dplyr”:

install.pacakges(“dplyr”)
library(dplyr)

Sau đó mới gỡ bỏ biến comorbid:

COPD <- select(COPD, -comorbid)

Vại là xong, mình chạy lại từ đầu như hướng dẫn trong coursera thì không bị lỗi nữa. Phew!

Và nhớ là cần bảo R biết comorbid là biến category chứ không phải biến có giá trị số bằng câu lệnh: comorbid = as.factor(comorbid) vì ở đây ta xét có (1) hoặc không (0).

Cũng hơi vui vui vì tìm ra cách sửa lỗi, và phát hiện ra cách viết một câu lệnh khác với hướng dẫn nhưng vẫn cho ra đúng kết quả.

One Reply to “Lệnh trong R – Tạo biến điều kiện”

  1. Lâu lắm rồi em không nghe tin tức của chị Vy. Tự dưng mò vào blog đọc bài mới nhất này, dù cũng đã vài tháng nhưng thấy Vy vẫn khoẻ, vẫn học hỏi mỗi ngày là em mừng. Mong Vy thật nhiều sức khoẻ và an yên.

Leave a Reply

Your email address will not be published. Required fields are marked *