R - การปรับรูปร่างข้อมูล

การปรับรูปร่างข้อมูลใน R เป็นเรื่องเกี่ยวกับการเปลี่ยนวิธีจัดระเบียบข้อมูลเป็นแถวและคอลัมน์ การประมวลผลข้อมูลเวลาส่วนใหญ่ใน R ทำได้โดยการรับข้อมูลเข้าเป็นกรอบข้อมูล ง่ายต่อการดึงข้อมูลจากแถวและคอลัมน์ของ data frame แต่มีสถานการณ์เมื่อเราต้องการ data frame ในรูปแบบที่แตกต่างจากรูปแบบที่เราได้รับ R มีฟังก์ชันมากมายในการแบ่งรวมและเปลี่ยนแถวเป็นคอลัมน์และในทางกลับกันในกรอบข้อมูล

การเข้าร่วมคอลัมน์และแถวในกรอบข้อมูล

เราสามารถรวมเวกเตอร์หลายตัวเพื่อสร้างกรอบข้อมูลโดยใช้ไฟล์ cbind()ฟังก์ชัน นอกจากนี้เรายังสามารถผสานสองเฟรมข้อมูลโดยใช้rbind() ฟังก์ชัน

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

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

# # # # 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

การผสานกรอบข้อมูล

เราสามารถผสานสองเฟรมข้อมูลโดยใช้ merge()ฟังก์ชัน เฟรมข้อมูลต้องมีชื่อคอลัมน์เดียวกันกับที่เกิดการผสาน

ในตัวอย่างด้านล่างเราพิจารณาชุดข้อมูลเกี่ยวกับโรคเบาหวานใน Pima Indian Women ที่มีอยู่ในห้องสมุดชื่อ "MASS" เรารวมชุดข้อมูลสองชุดโดยพิจารณาจากค่าความดันโลหิต ("bp") และดัชนีมวลกาย ("bmi") ในการเลือกสองคอลัมน์นี้สำหรับการรวมระเบียนที่ค่าของตัวแปรทั้งสองนี้ตรงกันในชุดข้อมูลทั้งสองจะถูกรวมเข้าด้วยกันเพื่อสร้างกรอบข้อมูลเดียว

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)

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

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

การหลอมและการหล่อ

สิ่งที่น่าสนใจที่สุดอย่างหนึ่งของการเขียนโปรแกรม R คือการเปลี่ยนรูปร่างของข้อมูลในหลาย ๆ ขั้นตอนเพื่อให้ได้รูปร่างที่ต้องการ ฟังก์ชันที่ใช้ในการทำเช่นนี้เรียกว่าmelt() และ cast().

เราพิจารณาชุดข้อมูลที่เรียกว่าเรือที่มีอยู่ในไลบรารีชื่อ "MASS"

library(MASS)
print(ships)

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

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
............
............

ละลายข้อมูล

ตอนนี้เราหลอมรวมข้อมูลเพื่อจัดระเบียบโดยแปลงคอลัมน์ทั้งหมดที่ไม่ใช่ประเภทและปีเป็นหลายแถว

molten.ships <- melt(ships, id = c("type","year"))
print(molten.ships)

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

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
...........
...........

ส่งข้อมูล Molten

เราสามารถโยนข้อมูลที่หลอมละลายให้อยู่ในรูปแบบใหม่ที่สร้างการรวมของเรือแต่ละประเภทในแต่ละปี ทำได้โดยใช้ไฟล์cast() ฟังก์ชัน

recasted.ship <- cast(molten.ships, type+year~variable,sum)
print(recasted.ship)

เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

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