T
|
rong quá
trình xử lý, phân tích số liệu vì một lý do nào đó, chúng ta muốn phân tích
riêng cho từng đối tượng, địa điểm, độ tuổi hay từng công thức thí nghiệm tùy
theo mục đích nghiên cứu. Lệnh subset trong R giúp chúng ta làm
chuyện này với một vài thao tác đơn giản, không mất nhiều thời gian như các biện
pháp thông thường.
Để minh chứng,
tiện cho việc theo dõi và hiểu “câu chuyện” tôi xin được lấy một ví dụ mà tôi
đã xử lý, để ôn lại cho nhớ và muốn lưu lại tham khảo. Lệnh subset (data, cond), trong đó data là data.frame mà chúng ta muốn tách
rời và cond là điều kiện. Ví dụ:
> kllBTB
data
(kllBTBT) gồm các biến sau (biến liên tục, biến không liên tục):
> names(kllBTB)
[1] "Local" "Age" "CTTN"
[4]
"stump_diameter"
"tree_height"
"canopy_diameter"
[7]
"Main_trunk"
"bough_50"
"phan_than"
[10] "stump_diameter_growth" "tree_height_growth" "canopy_diameter_growth"
Tuy nhiên, vấn đề gặp phải là trong data (kllBTB) ở
biến Local có 3 địa phương (Cam_Duong, Le_Thuy và Trieu_Phong), biến Age có
(1.0, 1.2, 2.3), biến CTTN có 4 công thức (DC, CT 1, CT 2, CT 3). Với mục đích
phân tích 12 biến trên cho từng địa phương, cho từng độ tuổi và từng công thức
thí nghiệm, ngay cả vẽ biểu đồ sau này. Như thông thường chúng ta có các cách
sau: (i) Nhập và lưu số liệu cho từng địa phương (Local), cho từng độ tuổi
(Age); (ii) Tách số liệu thủ công bằng cách lưu cho từng địa phương cho từng độ
tuổi khác nhau (coppy paste trong excel). Trong khi, data (kllBTB) nhập đầy đủ
số liệu cho các địa phương, ở các độ tuổi và CTTN khác nhau với hàng ngàn dữ
liệu. Nếu làm thủ công sẽ lưu nhiều file, mất nhiều thời gian, và nếu có sử
dụng trong r cũng khá mất công (thực ra trong r vẫn còn nhiều cách để thực hiện,
tuy nhiên trong giới hạn vốn hiểu biết, tìm tòi của mình có hạn nên rất mong
được quý độc giả góp ý để mình biết thêm những packages, những hàm, những lệnh
hữu ích hơn. Cũng xin mạn phép được bỏ quá cho, bởi mình đang trong quá trình
tìm hiểu, và thực hành nên không tránh khỏi những thiếu sót. Trân trọng).
Lệnh subset trong r sẽ giúp chúng ta một cách đơn
giản, gọn nhẹ, nhanh chóng và khoa học. Chúng ta cùng bắt đầu nhé.
> kllBTB
id
|
Local
|
Age
|
CTTN
|
stum_
diameter
|
tree_
height
|
canopy_
diameter
|
main_
trunk
|
bough_50
|
phan_than
|
1
|
Le_Thuy
|
1.0
|
DC
|
2.6
|
0.8
|
0.8
|
4
|
2
|
0
|
2
|
Le_Thuy
|
1.0
|
DC
|
1.9
|
0.8
|
1.3
|
4
|
3
|
0
|
3
|
Le_Thuy
|
1.0
|
DC
|
1.9
|
0.8
|
1.3
|
6
|
2
|
0
|
4
|
Le_Thuy
|
1.0
|
DC
|
2.7
|
1.1
|
1.4
|
3
|
2
|
0
|
5
|
Le_Thuy
|
1.0
|
DC
|
2.6
|
1.1
|
1.5
|
6
|
1
|
0
|
...
|
|||||||||
1673
|
Cam_Duong
|
2.0
|
CT 3
|
4.1
|
1.8
|
2.0
|
1
|
16
|
1
|
1674
|
Cam_Duong
|
2.0
|
CT 3
|
6.5
|
2.7
|
2.3
|
1
|
21
|
1
|
1675
|
Cam_Duong
|
2.0
|
CT 3
|
4.7
|
2.2
|
2.8
|
2
|
26
|
1
|
Thứ nhất, tách dữ
liệu cho từng địa phương.
> TrieuPhong=subset(kllBTB, Local=="Trieu_Phong")
> LeThuy=subset(kllBTB, Local=="Le_Thuy")
> CamDuong=subset(kllBTB, Local=="Cam_Duong")
Từ các
data.frame (TrieuPhong, LeThuy và CamDuong) được tách chiết từ data (kllBTB), chúng ta có thể xử lý
riêng cho từng địa phương. Tuy nhiên, vấn đề gặp phải tiếp theo là ở mỗi địa
phương lại có các độ tuổi và các CTTN khác nhau, vì vậy việc phân tích thống kê
hay vẽ biểu đồ vẫn gặp một số khó khăn nhất định.
Phân tích
thống kê ở đây tôi chỉ đề cập đến một số thông số cơ bản như: mean, sd (độ lệch
chuẩn), se (sai số chuẩn), median, min, max, bách phân vị 25%, bách phân vị
75%... Vẽ biểu đồ ở đây tôi chỉ đề cập đến các loại biểu đồ thông dụng như:
boxplot, point, tương quan, kết hợp giữa biểu đồ tương quan với histogram hay
density...
Trong data mới có tên là CamDuong (chiết dữ liệu từ kllBB bằng lệnh):
> CamDuong=subset(kllBTB, Local=="Cam_Duong")
Trong data.frame (CamDuong) có 2 độ tuổi khác nhau với 4 CTTN. Vấn đề đặt ra
là chiết dữ liệu tiếp theo các độ tuổi khác nhau, để tiện cho việc phân tích và
vẽ biểu đồ. Cụ thể như sau:
Thứ hai, sử dụng tiếp lệnh subset để chiết tách theo
các độ tuổi khác nhau
Ta lại có thêm 2 data mới tách chiết từ data (CamDuong) là Age1.2 và Age2.3.
Có nghĩa là ở Age1.2 các dữ liệu ở độ tuổi 1.2 còn các biến số và CTTN vẫn giữ
nguyên, tương tự Age2.3.
> Age1.2CamDuong=subset(CamDuong, Age=="1.2")
> Age2.3CamDuong=subset(CamDuong, Age=="2.3")
Đến đây ta dùng lệnh describyBy trong packages (psych) để phân tích thống kê.
Kết quả như sau:
> library(psych)
> describeBy(Age1.2CamDuong, gruop=CTTN, skew=F, range=F)
> attach(Age1.2)
> library(psych)
> describeBy(Age1.2CanDuong, group=CTTN, skew=F, range=F)
group: CT 1
vars n mean sd
se
Local*
1 47 1.00 0.00 0.00
Age
2 47 1.20 0.00 0.00
CTTN*
3 47 1.00 0.00 0.00
stump_diameter 4 47 2.58 0.69 0.10
tree_height
5 47 0.87 0.25 0.04
canopy_diameter
6 47 1.06 0.25 0.04
Main_trunk
7 47 3.49 1.32 0.19
bough_50
8 47 2.30 1.08 0.16
phan_than
9 47 0.21 0.41 0.06
stump_diameter_growth
10 47 2.15 0.57 0.08
tree_height_growth
11 47 0.72 0.21 0.03
canopy_diameter_growth
12 47 0.86 0.21 0.03
litter_fall
13 47 0.12 0.04 0.01
---------------------------------------------
group: CT 2
vars n mean sd
se
Local*
1 71 1.00 0.00 0.00
Age
2 71 1.20 0.00 0.00
CTTN*
3 71 2.00 0.00 0.00
stump_diameter
4 71 2.31 0.77 0.09
tree_height
5 71 0.77 0.20 0.02
canopy_diameter
6 71 0.92 0.31 0.04
Main_trunk
7 71 2.86 1.38 0.16
bough_50
8 71 1.77 1.00 0.12
phan_than
9 71 0.06 0.23 0.03
stump_diameter_growth
10 71 1.93 0.64 0.08
tree_height_growth
11 71 0.64 0.17 0.02
canopy_diameter_growth
12 71 0.75 0.26 0.03
litter_fall
13 71 0.11 0.04 0.00
---------------------------------------------
group: CT 3
vars
n mean sd se
Local*
1 110 1.00 0.00 0.00
Age
2 110 1.20 0.00 0.00
CTTN*
3 110 3.00 0.00 0.00
stump_diameter
4 110 2.67 0.81 0.08
tree_height
5 110 0.97 0.33 0.03
canopy_diameter
6 110 1.17 0.40 0.04
Main_trunk
7 110 3.55 1.54 0.15
bough_50
8 110 2.32 1.17 0.11
phan_than
9 110 0.13 0.33 0.03
stump_diameter_growth
10 110 2.23 0.68 0.06
tree_height_growth
11 110 0.79 0.28 0.03
canopy_diameter_growth
12 110 0.97 0.33 0.03
litter_fall
13 110 0.13 0.04 0.00
----------------------------------------------
group: DC
vars n mean sd
se
Local*
1 19 1.00 0.00 0.00
Age
2 19 1.20 0.00 0.00
CTTN*
3 19 4.00 0.00 0.00
stump_diameter
4 19 2.20 0.59 0.14
tree_height
5 19 0.72 0.25 0.06
canopy_diameter 6 19 0.85 0.30 0.07
Main_trunk
7 19 2.16 1.12 0.26
bough_50
8 19 1.26 0.81 0.18
phan_than
9 19 0.26 0.45 0.10
stump_diameter_growth
10 19 1.83 0.49 0.11
tree_height_growth
11 19 0.59 0.19 0.04
canopy_diameter_growth
12 19 0.69 0.25 0.06
litter_fall
13 19 0.10 0.03 0.01
Tương tự ở độ
tuổi 2.3
> describeBy(Age2.3CamDuong, group=CTTN, skew=F, range=F)
group: CT 1
vars n mean sd
se
Local*
1 64 1.00 0.00 0.00
Age
2 64 2.30 0.00 0.00
CTTN*
3 64 1.00 0.00 0.00
stump_diameter
4 64 3.22 0.95 0.12
tree_height
5 64 1.39 0.40 0.05
canopy_diameter
6 64 1.76 0.33 0.04
Main_trunk
7 64 2.33 0.84 0.10
bough_50
8 64 9.95 3.01 0.38
phan_than 9 64 0.38 0.49 0.06
stump_diameter_growth
10 64 1.43 0.42 0.05
tree_height_growth
11 64 0.61 0.19 0.02
canopy_diameter_growth
12 64 0.78 0.15 0.02
litter_fall
13 64 0.16 0.05 0.01
----------------------------------------------
group: CT 2
vars n mean sd
se
Local*
1 69 1.00 0.00 0.00
Age
2 69 2.30 0.00 0.00
CTTN*
3 69 2.00 0.00 0.00
stump_diameter 4 69 3.30 1.31 0.16
tree_height
5 69 1.39 0.42 0.05
canopy_diameter
6 69 1.80 0.45 0.05
Main_trunk
7 69 2.67 1.22 0.15
bough_50
8 69 9.49 2.74 0.33
phan_than
9 69 0.38 0.49 0.06
stump_diameter_growth
10 69 1.47 0.58 0.07
tree_height_growth
11 69 0.61 0.19 0.02
canopy_diameter_growth
12 69 0.79 0.20 0.02
litter_fall
13 69 0.16 0.07 0.01
---------------------------------------------
group: CT 3
vars n mean
sd se
Local*
1 228 1.00 0.00 0.00
Age
2 228 2.30 0.00 0.00
CTTN*
3 228 3.00 0.00 0.00
stump_diameter
4 228 3.81 1.47 0.10
tree_height
5 228 1.63 0.63 0.04
canopy_diameter
6 228 2.06 0.54 0.04
Main_trunk
7 228 2.27 0.97 0.06
bough_50
8 228 12.85 6.58 0.44
phan_than
9 228 0.61 0.49 0.03
stump_diameter_growth
10 228 1.69 0.66 0.04
tree_height_growth
11 228 0.72 0.29 0.02
canopy_diameter_growth
12 228 0.91 0.24 0.02
litter_fall
13 228 0.19 0.08 0.01
-----------------------------------------------
group: DC
vars n mean
sd se
Local*
1 30 1.00 0.00 0.00
Age
2 30 2.30 0.00 0.00
CTTN*
3 30 4.00 0.00 0.00
stump_diameter
4 30 4.88 1.57 0.29
tree_height 5 30 1.78 0.51 0.09
canopy_diameter
6 30 2.47 0.40 0.07
Main_trunk
7 30 1.70 0.65 0.12
bough_50
8 30 12.60 4.11 0.75
phan_than
9 30 0.73 0.45 0.08
stump_diameter_growth
10 30 2.17 0.70 0.13
tree_height_growth
11 30 0.78 0.24 0.04
canopy_diameter_growth
12 30 1.08 0.18 0.03
litter_fall
13 30 0.24 0.08 0.02
Thứ ba, phân tích các chỉ tiêu bách phân vị 25%, bách phân vị 75%, median, max, min. Chúng ta sử dụng tiếp lệnh summary (data). Tuy nhiên ta chưa thể phân tích các chỉ tiêu trên cho tất cả các biến ở cùng độ tuổi trong cùng một công thức thí nghiệm. Nếu ta sử dụng lệnh summary (data=cd) thì cho kết quả các thông tin cần phân tích, nhưng lại phân tích chung cho tất cả các CTTN. Kết quả như sau:
> summary(Age1.2CamDuong)
Age CTTN stump_diameter tree_height canopy_diameter
Min. :1.000 CT 1: 57 Min. : 1.400 Min. :0.40 Min. :0.60
1st Qu.:1.000 CT 2:102 1st Qu.: 3.000 1st Qu.:0.90 1st Qu.:1.40
Median :1.600 CT 3:116 Median : 3.900 Median :1.50 Median :1.90
Mean :1.475 DC : 94 Mean : 4.215 Mean :1.58 Mean :1.88
3rd Qu.:2.000 3rd Qu.: 5.200 3rd Qu.:2.10 3rd Qu.:2.40
Max. :2.000 Max. :10.700 Max. :3.50 Max. :3.80
Main_trunk bough_50 phan_than stump_diameter_growth tree_height_growth
Min. :1.000 Min. : 0.000 Min. :0.0000 Min. :1.200 Min. :0.400
1st Qu.:1.000 1st Qu.: 1.000 1st Qu.:0.0000 1st Qu.:2.300 1st Qu.:0.800
Median :2.000 Median : 2.000 Median :1.0000 Median :2.800 Median :1.000
Mean :2.664 Mean : 9.558 Mean :0.5583 Mean :2.894 Mean :1.043
3rd Qu.:4.000 3rd Qu.:18.000 3rd Qu.:1.0000 3rd Qu.:3.300 3rd Qu.:1.200
Max. :8.000 Max. :38.000 Max. :1.0000 Max. :6.300 Max. :1.900
NA's :104
canopy_diameter_growth
Min. :0.600
1st Qu.:1.100
Median :1.300
Mean :1.271
3rd Qu.:1.400
Max. :1.900
Thứ tư, vấn đề đặt
ra là, sử dụng lệnh summary để phân tích các chỉ tiêu thống kê cho tất cả các
biến cho riêng từng CTTN. Ta lại dùng lệnh subset để tách riêng từng công thức,
cụ thể như sau:
> DC=subset(Age1.2tp, CTTN=="DC")
> DC
Local Age CTTN stump_diameter tree_height
canopy_diameter
135 Trieu_Phong 1.2
DC 1.7 0.6 0.6
136 Trieu_Phong 1.2
DC 1.3 0.4 0.7
137 Trieu_Phong 1.2
DC 1.9 0.6 0.9
138 Trieu_Phong 1.2
DC 1.7 0.6 0.6
139 Trieu_Phong 1.2
DC 1.8 0.6 0.6
140 Trieu_Phong 1.2
DC 2.4 0.7 0.8
141 Trieu_Phong 1.2
DC 1.8 0.5 0.6
142 Trieu_Phong 1.2
DC 2.5 1.0 1.1
143 Trieu_Phong 1.2
DC 1.7 0.4 0.6
144 Trieu_Phong 1.2
DC 2.0 0.7 0.7
145 Trieu_Phong 1.2
DC 2.0 0.7 0.7
146 Trieu_Phong 1.2
DC 3.2 0.9 1.2
147 Trieu_Phong 1.2
DC 2.2 1.0 0.9
148 Trieu_Phong 1.2
DC 3.2 1.1 1.4
149 Trieu_Phong 1.2
DC 3.1 1.3 1.4
150 Trieu_Phong 1.2
DC 2.5 0.7 1.1
151 Trieu_Phong 1.2
DC 2.5 0.9 1.2
152 Trieu_Phong 1.2
DC 2.9 0.4 0.6
153 Trieu_Phong 1.2
DC 1.4 0.5 0.4
Main_trunk bough_50
phan_than stump_diameter_growth tree_height_growth
135 1 1 1 1.4 0.5
136 5 0 0 1.1 0.4
137 2 2 0 1.6 0.5
138 1 1 0 1.4 0.5
139 1 1 1 1.5 0.5
140 2 2 0 2.0 0.6
141 1 1 1 1.5 0.4
142 2 1 1 2.1 0.8
143 3 0
0 1.4 0.3
144 2 1 0 1.7 0.6
145 2 2 0 1.6 0.6
146 1 1 1 2.7 0.8
147 3 1 0 1.9 0.8
148 2 2 0 2.7 0.9
149 3 3 0 2.5 1.0
150 2
2 0 2.1 0.6
151 3 2 0 2.0 0.7
152 4 1 0 2.4 0.4
153 1 0 0
1.2 0.4
canopy_diameter_growth
litter_fall
135
0.5 0.07
136
0.5 0.06
137
0.7 0.08
138
0.5 0.08
139 0.5 0.08
140
0.7 0.11
141
0.5 0.08
142
0.9 0.12
143
0.5 0.07
144
0.5 0.09
145
0.6 0.09
146 1.0 0.15
147
0.7 0.10
148
1.1 0.15
149
1.2 0.15
150
0.9 0.12
151
1.0 0.12
152
0.5 0.14
153
0.3 0.06
Tương tự cho các công thức còn lại:
> CT1=subset(Age1.2tp, CTTN=="CT 1")
> CT2=subset(Age1.2tp, CTTN=="CT 2")
> CT3=subset(Age1.2tp, CTTN=="CT 3")
Thứ năm, bây giờ ta có thể sử dụng lệnh summary cho từng công thức, cụ thể:
> summary(DC)
Age CTTN stump_diameter tree_height canopy_diameter Main_trunk
Min. :1.2 CT 1: 0 Min. :1.30 Min. :0.4000 Min. :0.4000 Min. :1.000
1st Qu.:1.2 CT 2: 0 1st Qu.:1.75 1st Qu.:0.5500 1st Qu.:0.6000 1st Qu.:1.000
Median :1.2 CT 3: 0 Median :2.00 Median :0.7000 Median :0.7000 Median :2.000
Mean :1.2 DC :19 Mean :2.20 Mean :0.7158 Mean :0.8474 Mean :2.158
3rd Qu.:1.2 3rd Qu.:2.50 3rd Qu.:0.9000 3rd Qu.:1.1000 3rd Qu.:3.000
Max. :1.2 Max. :3.20 Max. :1.3000 Max. :1.4000 Max. :5.000
bough_50 phan_than stump_diametergrowth treeheightgrowth canopydiametergrowth
Min. :0.000 Min. :0.0000 Min. :1.100 Min. :0.3000 Min. :0.3000
1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:1.450 1st Qu.:0.4500 1st Qu.:0.5000
Median :1.000 Median :0.0000 Median :1.700 Median :0.6000 Median :0.6000
Mean :1.263 Mean :0.2632 Mean :1.832 Mean :0.5947 Mean :0.6895
3rd Qu.:2.000 3rd Qu.:0.5000 3rd Qu.:2.100 3rd Qu.:0.7500 3rd Qu.:0.9000
Max. :3.000 Max. :1.0000 Max. :2.700 Max. :1.0000 Max. :1.2000
litter_fall
Min. :0.0600
1st Qu.:0.0800
Median :0.0900
Mean :0.1011
3rd Qu.:0.1200
Max. :0.1500
Tương tự cho CT1, CT2 và CT3.
Thứ sáu, từ đây ta có thể vẽ các loại biểu đồ cho từng địa
phương, cụ thể như sau:
Vẽ
biểu đồ boxplot:
Mã codes như sau:
> tp=ggplot(data=klltp, aes(klltp$CTTN, y=stump_diameter, fill=CTTN))+ geom_boxplot(aes(fill=CTTN))+ theme_bw()+ theme_classic()+ ylab("stump diameter, cm")+xlab("CTTN")
> tp5=tpp+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(klltp$stump_diameter))
Vẽ
biểu đồ tương quan tiếp
# Codes như sau:
> tp=ggplot(data=klltp,
aes(x=stump_diameter, y=tree_height, fill=CTTN))+ geom_point(aes(color=CTTN,
size=Main_trunk))+ theme_bw()+ theme_classic()+ xlab("stump diameter,
cm")+ ylab("tree height, m")+ geom_smooth(method="lm")
+ ggtitle("The correlation between tree height with stump diameter of
Acacia crassicarpa \n in coastal sandy regions of Quang Tri province")
> tp1=
tp+ geom_rangeframe()+ theme_tufte()+
scale_x_continuous(breaks=extended_range_breaks()(klltp$stump_diameter))+
scale_y_continuous(breaks=extended_range_breaks()(klltp$tree_height))
Vẽ
biểu đồ tương quan tiếp
>
ggMarginal(tp1, type="histogram", color="violet", size=2.5)
Vẽ biểu đồ tương quan tiếp
>
ggMarginal(tp1, type="density", color="red", size=2.5)
Trên đây
là một vài trường hợp mà chúng ta muốn phân tích riêng cho một đối tượng (hay địa
điểm), và để làm điều này chúng ta dùng lệnh subset(data, cond), trong đó, data
là data.frame mà chúng ta muốn tác rời,
và cond là điều kiện để tách. Như vậy,
với một vài thao tác chúng ta có dữ liệu mà cần phân tích riêng như ý muốn mà
không phải qua các bước trung gian như thường làm trong Excel.
0 nhận xét:
Post a Comment