R中的数据重塑是关于改变数据组织成行和列的方式.大多数情况下,R中的数据处理是通过将输入数据作为数据帧来完成的.从数据帧的行和列中提取数据很容易,但有些情况下我们需要的数据帧格式与我们收到它的格式不同. 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 columnsnew.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 zipcode1 Lowry CO 802302 Charlotte FL 33949# # # The combined data frame city state zipcode1 Tampa FL 336022 Seattle WA 981043 Hartford CT 61614 Denver CO 802945 Lowry CO 802306 Charlotte FL 33949
合并数据框
我们可以使用合并合并两个数据框( )功能.数据框必须具有相同的列名称才能进行合并.
在下面的示例中,我们认为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.y1 60 33.8 1 117 23 0.466 27 No 2 125 20 0.0882 64 29.7 2 75 24 0.370 33 No 2 100 23 0.3683 64 31.2 5 189 33 0.583 29 Yes 3 158 13 0.2954 64 33.2 4 117 27 0.230 24 No 1 96 27 0.2895 66 38.1 3 115 39 0.150 28 No 1 114 36 0.2896 68 38.5 2 100 25 0.324 26 No 7 129 49 0.4397 70 27.4 1 116 28 0.204 21 No 0 124 20 0.2548 70 33.1 4 91 32 0.446 22 No 9 123 44 0.3749 70 35.4 9 124 33 0.282 34 No 6 134 23 0.54210 72 25.6 1 157 21 0.123 24 No 4 99 17 0.29411 72 37.7 5 95 33 0.370 27 No 6 103 32 0.32412 74 25.9 9 134 33 0.460 81 No 8 126 38 0.16213 74 25.9 1 95 21 0.673 36 No 8 126 38 0.16214 78 27.6 5 88 30 0.258 37 No 6 125 31 0.56515 78 27.6 10 122 31 0.512 45 No 6 125 31 0.56516 78 39.4 2 112 50 0.175 24 No 4 112 40 0.23617 88 34.5 1 117 24 0.403 40 Yes 4 127 11 0.598 age.y type.y1 31 No2 21 No3 24 No4 21 No5 21 No6 43 Yes7 36 Yes8 40 No9 29 Yes10 28 No11 55 No12 39 No13 39 No14 49 Yes15 49 Yes16 38 No17 28 No[1] 17
融化和铸造
R编程最有趣的一个方面是以多个步骤改变数据的形状以获得所需的形状.用于执行此操作的函数称为 melt()和 cast().
我们认为称为船舶的数据集存在于库名为"MASS".
library(MASS)print(ships)
当我们执行上面的代码时,它产生以下结果 :
type year period service incidents1 A 60 60 127 02 A 60 75 63 03 A 65 60 1095 34 A 65 75 1095 45 A 70 60 1512 6..........................8 A 75 75 2244 119 B 60 60 44882 3910 B 60 75 17176 2911 B 65 60 28609 58........................17 C 60 60 1179 118 C 60 75 552 119 C 65 60 781 0........................
融化数据
现在我们将数据融合以组织它,将除type和year之外的所有列转换为多行.
molten.ships <- melt(ships, id = c("type","year"))print(molten.ships)
当我们执行上面的代码时,它产生以下结果 :
type year variable value1 A 60 period 602 A 60 period 753 A 65 period 604 A 65 period 75........................9 B 60 period 6010 B 60 period 7511 B 65 period 6012 B 65 period 7513 B 70 period 60......................41 A 60 service 12742 A 60 service 6343 A 65 service 1095......................70 D 70 service 120871 D 75 service 072 D 75 service 205173 E 60 service 4574 E 60 service 075 E 65 service 789......................101 C 70 incidents 6102 C 70 incidents 2103 C 75 incidents 0104 C 75 incidents 1105 D 60 incidents 0106 D 60 incidents 0......................
施放熔融数据
我们可以将熔融数据转换为新形式,其中每年创建每种类型船舶的总量.它是使用 cast()函数完成的.
recasted.ship <- cast(molten.ships, type+year~variable,sum)print(recasted.ship)
当我们执行上面的代码时,它产生以下结果 :
type year period service incidents1 A 60 135 190 02 A 65 135 2190 73 A 70 135 4865 244 A 75 135 2244 115 B 60 135 62058 686 B 65 135 48979 1117 B 70 135 20163 568 B 75 135 7117 189 C 60 135 1731 210 C 65 135 1457 111 C 70 135 2731 812 C 75 135 274 113 D 60 135 356 014 D 65 135 480 015 D 70 135 1557 1316 D 75 135 2051 417 E 60 135 45 018 E 65 135 1226 1419 E 70 135 3318 1720 E 75 135 542 1