经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
R语言数据重塑知识点总结
来源:jb51  时间:2021/3/29 8:51:39  对本文有异议

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

合并数据帧

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

在下面的例子中,我们考虑 library 名称“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

有时,电子表格数据的格式很紧凑,可以给出每个主题的协变量,然后是该主题的所有观测值。 R的建模功能需要在单个列中进行观察。 考虑以下来自重复MRI脑测量的数据样本

  1. Status Age V1 V2 V3 V4
  2. P 23646 45190 50333 55166 56271
  3. CC 26174 35535 38227 37911 41184
  4. CC 27723 25691 25712 26144 26398
  5. CC 27193 30949 29693 29754 30772
  6. CC 24370 50542 51966 54341 54273
  7. CC 28359 58591 58803 59435 61292
  8. CC 25136 45801 45389 47197 47126

在每个主题上有两个协变量和多达四个测量值。 数据从 Excel 导出为 mr.csv 文件。

我们可以使用堆栈来帮助操纵这些数据以给出单个响应。

  1. zz <- read.csv("mr.csv", strip.white = TRUE)
  2. zzz <- cbind(zz[gl(nrow(zz), 1, 4*nrow(zz)), 1:2], stack(zz[, 3:6]))

结果为:

  1. Status Age values ind
  2. X1 P 23646 45190 V1
  3. X2 CC 26174 35535 V1
  4. X3 CC 27723 25691 V1
  5. X4 CC 27193 30949 V1
  6. X5 CC 24370 50542 V1
  7. X6 CC 28359 58591 V1
  8. X7 CC 25136 45801 V1
  9. X11 P 23646 50333 V2
  10. ...

函数unstack的方向相反,可能对导出数据很有用。

另一种方法是使用函数重塑

  1. > reshape(zz, idvar="id",timevar="var",
  2. varying=list(c("V1","V2","V3","V4")),direction="long")
  3. Status Age var V1 id
  4. 1.1 P 23646 1 45190 1
  5. 2.1 CC 26174 1 35535 2
  6. 3.1 CC 27723 1 25691 3
  7. 4.1 CC 27193 1 30949 4
  8. 5.1 CC 24370 1 50542 5
  9. 6.1 CC 28359 1 58591 6
  10. 7.1 CC 25136 1 45801 7
  11. 1.2 P 23646 2 50333 1
  12. 2.2 CC 26174 2 38227 2
  13. ...

重塑函数的语法比堆栈更复杂,但可以用于“long”表单中不止一列的数据。如果方向=“宽”,重塑还可以执行相反的转换。

到此这篇关于R语言数据重塑知识点总结的文章就介绍到这了,更多相关R语言数据重塑内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号