R 数据重塑

R语言中的数据重塑是关于改变数据被组织成行和列的方式。 大多数时间R语言中的数据处理是通过将输入数据作为数据帧来完成的。 很容易从数据帧的行和列中提取数据,但是在某些情况下,我们需要的数据帧格式与我们接收数据帧的格式不同。 R语言具有许多功能,在数据帧中拆分,合并和将行更改为列,反之亦然。

于数据帧中加入列和行

我们可以使用cbind()函数连接多个向量来创建数据帧。 此外,我们可以使用rbind()函数合并两个数据帧。

  1. # Create vector objects.
  2. city <- c("Tampa","Seattle","Hartford","Denver")
  3. state <- c("FL","WA","CT","CO")
  4. zipcode <- c(33602,98104,06161,80294)
  5. # Combine above three vectors into one data frame.
  6. addresses <- cbind(city,state,zipcode)
  7. # Print a header.
  8. cat("# # # # The First data frame
  9. ")
  10. # Print the data frame.
  11. print(addresses)
  12. # Create another data frame with similar columns
  13. new.address <- data.frame(
  14. city = c("Lowry","Charlotte"),
  15. state = c("CO","FL"),
  16. zipcode = c("80230","33949"),
  17. stringsAsFactors = FALSE
  18. )
  19. # Print a header.
  20. cat("# # # The Second data frame
  21. ")
  22. # Print the data frame.
  23. print(new.address)
  24. # Combine rows form both the data frames.
  25. all.addresses <- rbind(addresses,new.address)
  26. # Print a header.
  27. cat("# # # The combined data frame
  28. ")
  29. # Print the result.
  30. print(all.addresses)

当我们执行上面的代码,它产生以下结果:

  1. # # # # The First data frame
  2. city state zipcode
  3. [1,] "Tampa" "FL" "33602"
  4. [2,] "Seattle" "WA" "98104"
  5. [3,] "Hartford" "CT" "6161"
  6. [4,] "Denver" "CO" "80294"
  7. # # # The Second data frame
  8. city state zipcode
  9. 1 Lowry CO 80230
  10. 2 Charlotte FL 33949
  11. # # # The combined data frame
  12. city state zipcode
  13. 1 Tampa FL 33602
  14. 2 Seattle WA 98104
  15. 3 Hartford CT 6161
  16. 4 Denver CO 80294
  17. 5 Lowry CO 80230
  18. 6 Charlotte FL 33949

合并数据帧

我们可以使用merge()函数合并两个数据帧。 数据帧必须具有相同的列名称,在其上进行合并。

在下面的例子中,我们考虑图书馆名称“MASS”中有关Pima Indian Women的糖尿病的数据集。 我们基于血压(“bp”)和体重指数(“bmi”)的值合并两个数据集。 在选择这两列用于合并时,其中这两个变量的值在两个数据集中匹配的记录被组合在一起以形成单个数据帧。

  1. library(MASS)
  2. merged.Pima <- merge(x = Pima.te, y = Pima.tr,
  3. by.x = c("bp", "bmi"),
  4. by.y = c("bp", "bmi")
  5. )
  6. print(merged.Pima)
  7. nrow(merged.Pima)

当我们执行上面的代码,它产生以下结果:

  1. bp bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y
  2. 1 60 33.8 1 117 23 0.466 27 No 2 125 20 0.088
  3. 2 64 29.7 2 75 24 0.370 33 No 2 100 23 0.368
  4. 3 64 31.2 5 189 33 0.583 29 Yes 3 158 13 0.295
  5. 4 64 33.2 4 117 27 0.230 24 No 1 96 27 0.289
  6. 5 66 38.1 3 115 39 0.150 28 No 1 114 36 0.289
  7. 6 68 38.5 2 100 25 0.324 26 No 7 129 49 0.439
  8. 7 70 27.4 1 116 28 0.204 21 No 0 124 20 0.254
  9. 8 70 33.1 4 91 32 0.446 22 No 9 123 44 0.374
  10. 9 70 35.4 9 124 33 0.282 34 No 6 134 23 0.542
  11. 10 72 25.6 1 157 21 0.123 24 No 4 99 17 0.294
  12. 11 72 37.7 5 95 33 0.370 27 No 6 103 32 0.324
  13. 12 74 25.9 9 134 33 0.460 81 No 8 126 38 0.162
  14. 13 74 25.9 1 95 21 0.673 36 No 8 126 38 0.162
  15. 14 78 27.6 5 88 30 0.258 37 No 6 125 31 0.565
  16. 15 78 27.6 10 122 31 0.512 45 No 6 125 31 0.565
  17. 16 78 39.4 2 112 50 0.175 24 No 4 112 40 0.236
  18. 17 88 34.5 1 117 24 0.403 40 Yes 4 127 11 0.598
  19. age.y type.y
  20. 1 31 No
  21. 2 21 No
  22. 3 24 No
  23. 4 21 No
  24. 5 21 No
  25. 6 43 Yes
  26. 7 36 Yes
  27. 8 40 No
  28. 9 29 Yes
  29. 10 28 No
  30. 11 55 No
  31. 12 39 No
  32. 13 39 No
  33. 14 49 Yes
  34. 15 49 Yes
  35. 16 38 No
  36. 17 28 No
  37. [1] 17

melt()拆分数据和cast()数据重构

R语言编程的一个最有趣的方面是关于在多个步骤中改变数据的形状以获得期望的形状。 用于执行此操作的函数称为melt()和cast()。

我们考虑称为船舶的数据集称为“MASS”。

  1. library(MASS)
  2. print(ships)

当我们执行上面的代码,它产生以下结果:

  1. type year period service incidents
  2. 1 A 60 60 127 0
  3. 2 A 60 75 63 0
  4. 3 A 65 60 1095 3
  5. 4 A 65 75 1095 4
  6. 5 A 70 60 1512 6
  7. .............
  8. .............
  9. 8 A 75 75 2244 11
  10. 9 B 60 60 44882 39
  11. 10 B 60 75 17176 29
  12. 11 B 65 60 28609 58
  13. ............
  14. ............
  15. 17 C 60 60 1179 1
  16. 18 C 60 75 552 1
  17. 19 C 65 60 781 0
  18. ............
  19. ............

melt()拆分数据

现在我们拆分数据进行重组,将除类型和年份以外的所有列转换为多行展示。

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

当我们执行上面的代码,它产生以下结果:

  1. type year variable value
  2. 1 A 60 period 60
  3. 2 A 60 period 75
  4. 3 A 65 period 60
  5. 4 A 65 period 75
  6. ............
  7. ............
  8. 9 B 60 period 60
  9. 10 B 60 period 75
  10. 11 B 65 period 60
  11. 12 B 65 period 75
  12. 13 B 70 period 60
  13. ...........
  14. ...........
  15. 41 A 60 service 127
  16. 42 A 60 service 63
  17. 43 A 65 service 1095
  18. ...........
  19. ...........
  20. 70 D 70 service 1208
  21. 71 D 75 service 0
  22. 72 D 75 service 2051
  23. 73 E 60 service 45
  24. 74 E 60 service 0
  25. 75 E 65 service 789
  26. ...........
  27. ...........
  28. 101 C 70 incidents 6
  29. 102 C 70 incidents 2
  30. 103 C 75 incidents 0
  31. 104 C 75 incidents 1
  32. 105 D 60 incidents 0
  33. 106 D 60 incidents 0
  34. ...........
  35. ...........

cast()重构数据

我们可以将被拆分的数据转换为一种新形式,使用cast()函数创建每年每种类型的船的总和。

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

当我们执行上面的代码,它产生以下结果:

  1. type year period service incidents
  2. 1 A 60 135 190 0
  3. 2 A 65 135 2190 7
  4. 3 A 70 135 4865 24
  5. 4 A 75 135 2244 11
  6. 5 B 60 135 62058 68
  7. 6 B 65 135 48979 111
  8. 7 B 70 135 20163 56
  9. 8 B 75 135 7117 18
  10. 9 C 60 135 1731 2
  11. 10 C 65 135 1457 1
  12. 11 C 70 135 2731 8
  13. 12 C 75 135 274 1
  14. 13 D 60 135 356 0
  15. 14 D 65 135 480 0
  16. 15 D 70 135 1557 13
  17. 16 D 75 135 2051 4
  18. 17 E 60 135 45 0
  19. 18 E 65 135 1226 14
  20. 19 E 70 135 3318 17
  21. 20 E 75 135 542 1