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()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