1.2 数据结构的索引

1.2.1 问题

你想获得数据结构的一部分。

1.2.2 方案

可以使用数字索引或通过使用适当长度的布尔向量来提取向量、矩阵或数据框中的元素。以下例子中使用了多种方式来解决这一问题。

1.2.2.1 使用数字和名称进行索引

对于向量

  1. # 样本向量
  2. v <- c(1, 4, 4, 3, 2, 2, 3)
  3. v[c(2, 3, 4)]
  4. #> [1] 4 4 3
  5. v[2:4]
  6. #> [1] 4 4 3
  7. v[c(2, 4, 3)]
  8. #> [1] 4 3 4

对于数据框:

  1. # 创建样本数据框
  2. data <- read.table(header = T, text = "
  3. subject sex size
  4. 1 M 7
  5. 2 F 6
  6. 3 F 9
  7. 4 M 11
  8. ")
  9. # 获取位于第一行第三列的元素
  10. data[1, 3]
  11. #> [1] 7
  12. data[1, "size"]
  13. #> [1] 7
  14. # 获取第1行和第2行所有列上的元素
  15. data[1:2, ]
  16. #> subject sex size
  17. #> 1 1 M 7
  18. #> 2 2 F 6
  19. data[c(1, 2), ]
  20. #> subject sex size
  21. #> 1 1 M 7
  22. #> 2 2 F 6
  23. # 获取一,二两行第二列上的元素
  24. data[1:2, 2]
  25. #> [1] M F
  26. #> Levels: F M
  27. data[c(1, 2), 2]
  28. #> [1] M F
  29. #> Levels: F M
  30. # 获取行1和2,名为“sex”和 'size'的列
  31. data[1:2, c("sex", "size")]
  32. #> sex size
  33. #> 1 M 7
  34. #> 2 F 6
  35. data[c(1, 2), c(2, 3)]
  36. #> sex size
  37. #> 1 M 7
  38. #> 2 F 6

1.2.2.2 使用布尔向量进行索引

向量 v 同上。

  1. v > 2
  2. #> [1] FALSE TRUE TRUE TRUE FALSE FALSE TRUE
  3. v[v > 2]
  4. #> [1] 4 4 3 3
  5. v[c(F, T, T, T, F, F, T)]
  6. #> [1] 4 4 3 3

数据框同上。

  1. # 一个布尔向量
  2. data$subject < 3
  3. #> [1] TRUE TRUE FALSE FALSE
  4. data[data$subject < 3, ]
  5. #> subject sex size
  6. #> 1 1 M 7
  7. #> 2 2 F 6
  8. data[c(TRUE, TRUE, FALSE, FALSE), ]
  9. #> subject sex size
  10. #> 1 1 M 7
  11. #> 2 2 F 6
  12. # 也可以获取TRUE的数字索引
  13. which(data$subject < 3)
  14. #> [1] 1 2

1.2.2.3 负索引

与其他某些编程语言不同,当您在 R 中使用负数进行索引时,并不意味着从后向前索引。相反,它意味着按照通常的从前往后顺序删除索引中的元素。

  1. # 还是这个向量
  2. v
  3. #> [1] 1 4 4 3 2 2 3
  4. # 删除第一个
  5. v[-1]
  6. #> [1] 4 4 3 2 2 3
  7. # 删除前三个
  8. v[-1:-3]
  9. #> [1] 3 2 2 3
  10. # 只删除最后一个
  11. v[-length(v)]
  12. #> [1] 1 4 4 3 2 2