R - Định hình lại dữ liệu
Định hình lại dữ liệu trong R là thay đổi cách tổ chức dữ liệu thành các hàng và cột. Hầu hết thời gian xử lý dữ liệu trong R được thực hiện bằng cách lấy dữ liệu đầu vào làm khung dữ liệu. Rất dễ dàng để trích xuất dữ liệu từ các hàng và cột của khung dữ liệu nhưng có những tình huống khi chúng ta cần khung dữ liệu ở định dạng khác với định dạng mà chúng tôi đã nhận nó. R có nhiều chức năng để tách, hợp nhất và thay đổi các hàng thành cột và ngược lại trong một khung dữ liệu.
Nối các cột và hàng trong khung dữ liệu
Chúng ta có thể nối nhiều vectơ để tạo khung dữ liệu bằng cách sử dụng cbind()chức năng. Ngoài ra, chúng tôi có thể hợp nhất hai khung dữ liệu bằng cách sử dụngrbind() chức năng.
# Create vector objects.
city <- c("Tampa","Seattle","Hartford","Denver")
state <- c("FL","WA","CT","CO")
zipcode <- c(33602,98104,06161,80294)
# Combine above three vectors into one data frame.
addresses <- cbind(city,state,zipcode)
# Print a header.
cat("# # # # The First data frame\n")
# Print the data frame.
print(addresses)
# Create another data frame with similar columns
new.address <- data.frame(
city = c("Lowry","Charlotte"),
state = c("CO","FL"),
zipcode = c("80230","33949"),
stringsAsFactors = FALSE
)
# Print a header.
cat("# # # The Second data frame\n")
# Print the data frame.
print(new.address)
# Combine rows form both the data frames.
all.addresses <- rbind(addresses,new.address)
# Print a header.
cat("# # # The combined data frame\n")
# Print the result.
print(all.addresses)
Khi chúng tôi thực thi đoạn mã trên, nó tạo ra kết quả sau:
# # # # The First data frame
city state zipcode
[1,] "Tampa" "FL" "33602"
[2,] "Seattle" "WA" "98104"
[3,] "Hartford" "CT" "6161"
[4,] "Denver" "CO" "80294"
# # # The Second data frame
city state zipcode
1 Lowry CO 80230
2 Charlotte FL 33949
# # # The combined data frame
city state zipcode
1 Tampa FL 33602
2 Seattle WA 98104
3 Hartford CT 6161
4 Denver CO 80294
5 Lowry CO 80230
6 Charlotte FL 33949
Hợp nhất các khung dữ liệu
Chúng tôi có thể hợp nhất hai khung dữ liệu bằng cách sử dụng merge()chức năng. Các khung dữ liệu phải có cùng tên cột mà việc hợp nhất sẽ diễn ra.
Trong ví dụ dưới đây, chúng tôi xem xét tập dữ liệu về bệnh tiểu đường ở phụ nữ da đỏ Pima có sẵn trong thư viện tên "MASS". chúng tôi hợp nhất hai tập dữ liệu dựa trên giá trị huyết áp ("bp") và chỉ số khối cơ thể ("bmi"). Khi chọn hai cột này để hợp nhất, các bản ghi trong đó giá trị của hai biến này khớp trong cả hai tập dữ liệu sẽ được kết hợp với nhau để tạo thành một khung dữ liệu duy nhất.
library(MASS)
merged.Pima <- merge(x = Pima.te, y = Pima.tr,
by.x = c("bp", "bmi"),
by.y = c("bp", "bmi")
)
print(merged.Pima)
nrow(merged.Pima)
Khi chúng tôi thực thi đoạn mã trên, nó tạo ra kết quả sau:
bp bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y
1 60 33.8 1 117 23 0.466 27 No 2 125 20 0.088
2 64 29.7 2 75 24 0.370 33 No 2 100 23 0.368
3 64 31.2 5 189 33 0.583 29 Yes 3 158 13 0.295
4 64 33.2 4 117 27 0.230 24 No 1 96 27 0.289
5 66 38.1 3 115 39 0.150 28 No 1 114 36 0.289
6 68 38.5 2 100 25 0.324 26 No 7 129 49 0.439
7 70 27.4 1 116 28 0.204 21 No 0 124 20 0.254
8 70 33.1 4 91 32 0.446 22 No 9 123 44 0.374
9 70 35.4 9 124 33 0.282 34 No 6 134 23 0.542
10 72 25.6 1 157 21 0.123 24 No 4 99 17 0.294
11 72 37.7 5 95 33 0.370 27 No 6 103 32 0.324
12 74 25.9 9 134 33 0.460 81 No 8 126 38 0.162
13 74 25.9 1 95 21 0.673 36 No 8 126 38 0.162
14 78 27.6 5 88 30 0.258 37 No 6 125 31 0.565
15 78 27.6 10 122 31 0.512 45 No 6 125 31 0.565
16 78 39.4 2 112 50 0.175 24 No 4 112 40 0.236
17 88 34.5 1 117 24 0.403 40 Yes 4 127 11 0.598
age.y type.y
1 31 No
2 21 No
3 24 No
4 21 No
5 21 No
6 43 Yes
7 36 Yes
8 40 No
9 29 Yes
10 28 No
11 55 No
12 39 No
13 39 No
14 49 Yes
15 49 Yes
16 38 No
17 28 No
[1] 17
Nóng chảy và đúc
Một trong những khía cạnh thú vị nhất của lập trình R là thay đổi hình dạng của dữ liệu theo nhiều bước để có được hình dạng mong muốn. Các hàm được sử dụng để làm điều này được gọi làmelt() và cast().
Chúng tôi coi tập dữ liệu được gọi là tàu có trong thư viện được gọi là "MASS".
library(MASS)
print(ships)
Khi chúng tôi thực thi đoạn mã trên, nó tạo ra kết quả sau:
type year period service incidents
1 A 60 60 127 0
2 A 60 75 63 0
3 A 65 60 1095 3
4 A 65 75 1095 4
5 A 70 60 1512 6
.............
.............
8 A 75 75 2244 11
9 B 60 60 44882 39
10 B 60 75 17176 29
11 B 65 60 28609 58
............
............
17 C 60 60 1179 1
18 C 60 75 552 1
19 C 65 60 781 0
............
............
Làm tan chảy dữ liệu
Bây giờ chúng tôi làm tan dữ liệu để sắp xếp nó, chuyển đổi tất cả các cột khác với loại và năm thành nhiều hàng.
molten.ships <- melt(ships, id = c("type","year"))
print(molten.ships)
Khi chúng tôi thực thi đoạn mã trên, nó tạo ra kết quả sau:
type year variable value
1 A 60 period 60
2 A 60 period 75
3 A 65 period 60
4 A 65 period 75
............
............
9 B 60 period 60
10 B 60 period 75
11 B 65 period 60
12 B 65 period 75
13 B 70 period 60
...........
...........
41 A 60 service 127
42 A 60 service 63
43 A 65 service 1095
...........
...........
70 D 70 service 1208
71 D 75 service 0
72 D 75 service 2051
73 E 60 service 45
74 E 60 service 0
75 E 65 service 789
...........
...........
101 C 70 incidents 6
102 C 70 incidents 2
103 C 75 incidents 0
104 C 75 incidents 1
105 D 60 incidents 0
106 D 60 incidents 0
...........
...........
Truyền dữ liệu nóng chảy
Chúng ta có thể chuyển dữ liệu nóng chảy sang một biểu mẫu mới trong đó tổng hợp của từng loại tàu cho mỗi năm được tạo ra. Nó được thực hiện bằng cách sử dụngcast() chức năng.
recasted.ship <- cast(molten.ships, type+year~variable,sum)
print(recasted.ship)
Khi chúng tôi thực thi đoạn mã trên, nó tạo ra kết quả sau:
type year period service incidents
1 A 60 135 190 0
2 A 65 135 2190 7
3 A 70 135 4865 24
4 A 75 135 2244 11
5 B 60 135 62058 68
6 B 65 135 48979 111
7 B 70 135 20163 56
8 B 75 135 7117 18
9 C 60 135 1731 2
10 C 65 135 1457 1
11 C 70 135 2731 8
12 C 75 135 274 1
13 D 60 135 356 0
14 D 65 135 480 0
15 D 70 135 1557 13
16 D 75 135 2051 4
17 E 60 135 45 0
18 E 65 135 1226 14
19 E 70 135 3318 17
20 E 75 135 542 1