Bạn có bộ dữ liệu sau, đây là kết quả đo chỉ số CD3+_T_CELL_FREQ ở hai thời điểm trước và sau. Ta sẽ thấy trong nhóm CONTROL_OLD và CONTROL_YOUNG ở cột BEGIN_CD3+_T_CELL_FREQ có đủ dữ liệu, trong khi ở cột FU_CD3+_T_CELL_FREQ tương ứng thì bị thiếu dữ liệu.
df <-readRDS("dataset/df1.rds")df
STUDY_ID STUDY_ARM BEGIN_CD3+_T_CELL_FREQ FU_CD3+_T_CELL_FREQ
1 ID_1 CONTROL_OLD 12.063157 NA
2 ID_2 CONTROL_OLD 10.964920 NA
3 ID_3 YEGD 6.135557 15.411331
4 ID_4 CONTROL_OLD 13.720531 NA
5 ID_5 CONTROL_OLD 10.207501 NA
6 ID_6 CONTROL_OLD 10.781260 NA
7 ID_7 CONTROL_OLD 8.561287 NA
8 ID_8 YEGD 10.378400 36.150698
9 ID_9 CONTROL_OLD 12.419222 NA
10 ID_10 YEGD 4.698543 53.858413
11 ID_11 CONTROL_OLD 9.877577 NA
12 ID_12 CONTROL_OLD 11.327839 NA
13 ID_13 YEGD 10.810302 NA
14 ID_14 YEGD 12.559336 NA
15 ID_15 CONTROL_OLD 12.618815 NA
16 ID_16 CONTROL_OLD 9.354778 NA
17 ID_17 YEGD 4.883078 30.915139
18 ID_18 CONTROL_OLD 10.481444 NA
19 ID_19 CONTROL_OLD 10.954867 NA
20 ID_20 YEGD 10.257006 12.503797
21 ID_21 CONTROL_YOUNG 12.011571 NA
22 ID_22 YEGD 9.304376 45.202878
23 ID_23 CONTROL_YOUNG 12.267157 NA
24 ID_24 YEGD 9.591158 8.710753
25 ID_25 YEGD 10.470832 10.584096
26 ID_26 YEGD 12.824044 42.963687
27 ID_27 CONTROL_YOUNG 9.660034 NA
28 ID_28 CONTROL_YOUNG 12.845677 NA
29 ID_29 CONTROL_OLD 10.438020 NA
30 ID_30 YEGD 9.466437 62.817237
Bạn hãy chuyển dữ liệu từ cột BEGIN qua cột FU chỉ dành cho hai nhóm CONTROL_OLD và CONTROL_YOUNG, để thu được kết quả như sau, cột mới tạo đặt tên là FU_CD3+_T_CELL_FREQ_new.
STUDY_ID STUDY_ARM BEGIN_CD3+_T_CELL_FREQ FU_CD3+_T_CELL_FREQ FU_CD3+_T_CELL_FREQ_new
1 ID_1 CONTROL_OLD 12.063157 NA 12.063157
2 ID_2 CONTROL_OLD 10.964920 NA 10.964920
3 ID_3 YEGD 6.135557 15.411331 15.411331
4 ID_4 CONTROL_OLD 13.720531 NA 13.720531
5 ID_5 CONTROL_OLD 10.207501 NA 10.207501
6 ID_6 CONTROL_OLD 10.781260 NA 10.781260
7 ID_7 CONTROL_OLD 8.561287 NA 8.561287
8 ID_8 YEGD 10.378400 36.150698 36.150698
9 ID_9 CONTROL_OLD 12.419222 NA 12.419222
10 ID_10 YEGD 4.698543 53.858413 53.858413
11 ID_11 CONTROL_OLD 9.877577 NA 9.877577
12 ID_12 CONTROL_OLD 11.327839 NA 11.327839
13 ID_13 YEGD 10.810302 NA NA
14 ID_14 YEGD 12.559336 NA NA
15 ID_15 CONTROL_OLD 12.618815 NA 12.618815
16 ID_16 CONTROL_OLD 9.354778 NA 9.354778
17 ID_17 YEGD 4.883078 30.915139 30.915139
18 ID_18 CONTROL_OLD 10.481444 NA 10.481444
19 ID_19 CONTROL_OLD 10.954867 NA 10.954867
20 ID_20 YEGD 10.257006 12.503797 12.503797
21 ID_21 CONTROL_YOUNG 12.011571 NA 12.011571
22 ID_22 YEGD 9.304376 45.202878 45.202878
23 ID_23 CONTROL_YOUNG 12.267157 NA 12.267157
24 ID_24 YEGD 9.591158 8.710753 8.710753
25 ID_25 YEGD 10.470832 10.584096 10.584096
26 ID_26 YEGD 12.824044 42.963687 42.963687
27 ID_27 CONTROL_YOUNG 9.660034 NA 9.660034
28 ID_28 CONTROL_YOUNG 12.845677 NA 12.845677
29 ID_29 CONTROL_OLD 10.438020 NA 10.438020
30 ID_30 YEGD 9.466437 62.817237 62.817237
TipĐáp án
Cách 1: Khai báo trực tiếp tên biến
Chú ý nếu tên biến có ký tự đặc biệt thì cần đặt trong hai dấu backticks ``
Bạn hãy chuyển dữ liệu thành dạng true long (mỗi dòng là đại diện cho 1 quan sát duy nhất (1 value), mã ID có thể bị trùng lặp) và dạng semi long (mỗi dòng là có thể có nhiều quan sát trên cùng mã ID, mã ID có thể bị trùng lặp).
TipĐáp án
Chuyển về dạng true long
library(tidyr)df_long <- tidyr:::pivot_longer(df, #vị trí các cột cần rã về dạng longcols =c(3:8),names_to ="chitieu", values_to ="ketqua")df_long <-as.data.frame(df_long)# cần loại bỏ các ký tự -1, -2, -3df_long
TT location chitieu ketqua
1 1 BÌNH MINH pH-1 5.33
2 1 BÌNH MINH pH-2 5.92
3 1 BÌNH MINH pH-3 6.10
4 1 BÌNH MINH salinity-1 3.20
5 1 BÌNH MINH salinity-2 2.80
6 1 BÌNH MINH salinity-3 2.90
7 2 CHÂU THÀNH pH-1 6.50
8 2 CHÂU THÀNH pH-2 7.20
9 2 CHÂU THÀNH pH-3 6.80
10 2 CHÂU THÀNH salinity-1 0.25
11 2 CHÂU THÀNH salinity-2 0.00
12 2 CHÂU THÀNH salinity-3 0.01
13 3 ĐỨC HÒA pH-1 5.99
14 3 ĐỨC HÒA pH-2 5.40
15 3 ĐỨC HÒA pH-3 5.70
16 3 ĐỨC HÒA salinity-1 2.10
17 3 ĐỨC HÒA salinity-2 1.58
18 3 ĐỨC HÒA salinity-3 2.00
gsub(pattern ="-(1|2|3)",replacement ="", df_long$chitieu) -> df_long$chitieu# sắp xếp lại theo thứ tựdf_long |> dplyr:::arrange(chitieu, location) -> df_longdf_long
TT location chitieu ketqua
1 1 BÌNH MINH pH 5.33
2 1 BÌNH MINH pH 5.92
3 1 BÌNH MINH pH 6.10
4 2 CHÂU THÀNH pH 6.50
5 2 CHÂU THÀNH pH 7.20
6 2 CHÂU THÀNH pH 6.80
7 3 ĐỨC HÒA pH 5.99
8 3 ĐỨC HÒA pH 5.40
9 3 ĐỨC HÒA pH 5.70
10 1 BÌNH MINH salinity 3.20
11 1 BÌNH MINH salinity 2.80
12 1 BÌNH MINH salinity 2.90
13 2 CHÂU THÀNH salinity 0.25
14 2 CHÂU THÀNH salinity 0.00
15 2 CHÂU THÀNH salinity 0.01
16 3 ĐỨC HÒA salinity 2.10
17 3 ĐỨC HÒA salinity 1.58
18 3 ĐỨC HÒA salinity 2.00
Chuyển về dạng semi-long
library(splitstackshape)# ta muốn giữ lại cột `pH` và `salinity`, theo quy tắc separator -1, -2, -3 thì loại đinames(df)