1.3 获取数据结构的子集

1.3.1 问题

你想得到一个由向量、矩阵或数据框里元素组成的子集。

1.3.2 方案

为了基于一些条件准则获得子集,可以使用 subset() 函数或者是方括号索引。 两种方式均在下方举例说明。

  1. v <- c(1, 4, 4, 3, 2, 2, 3)
  2. subset(v, v < 3)
  3. #> [1] 1 2 2
  4. v[v < 3]
  5. #> [1] 1 2 2
  6. # 另一个向量
  7. t <- c("small", "small", "large", "medium")
  8. # 删除 'small' 这一项
  9. subset(t, t != "small")
  10. #> [1] "large" "medium"
  11. t[t != "small"]
  12. #> [1] "large" "medium"

这两种方法之间的一个重要区别在于方括号索引可以为元素赋值,而 subset() 不可以。

  1. v[v < 3] <- 9
  2. subset(v, v < 3) <- 9
  3. #> Error in subset(v, v < 3) <- 9: 没有"subset<-"这个函数

数据框:

  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. subset(data, subject < 3)
  10. #> subject sex size
  11. #> 1 1 M 7
  12. #> 2 2 F 6
  13. data[data$subject < 3, ]
  14. #> subject sex size
  15. #> 1 1 M 7
  16. #> 2 2 F 6
  17. # 特定行和列的子集
  18. subset(data, subject < 3, select = -subject)
  19. #> sex size
  20. #> 1 M 7
  21. #> 2 F 6
  22. subset(data, subject < 3, select = c(sex, size))
  23. #> sex size
  24. #> 1 M 7
  25. #> 2 F 6
  26. subset(data, subject < 3, select = sex:size)
  27. #> sex size
  28. #> 1 M 7
  29. #> 2 F 6
  30. data[data$subject < 3, c("sex", "size")]
  31. #> sex size
  32. #> 1 M 7
  33. #> 2 F 6
  34. # 逻辑与的两个条件
  35. subset(data, subject < 3 & sex == "M")
  36. #> subject sex size
  37. #> 1 1 M 7
  38. data[data$subject < 3 & data$sex == "M", ]
  39. #> subject sex size
  40. #> 1 1 M 7
  41. # 逻辑或的两个条件
  42. subset(data, subject < 3 | sex == "M")
  43. #> subject sex size
  44. #> 1 1 M 7
  45. #> 2 2 F 6
  46. #> 4 4 M 11
  47. data[data$subject < 3 | data$sex == "M", ]
  48. #> subject sex size
  49. #> 1 1 M 7
  50. #> 2 2 F 6
  51. #> 4 4 M 11
  52. # 基于转换数据的条件
  53. subset(data, log2(size) > 3)
  54. #> subject sex size
  55. #> 3 3 F 9
  56. #> 4 4 M 11
  57. data[log2(data$size) > 3, ]
  58. #> subject sex size
  59. #> 3 3 F 9
  60. #> 4 4 M 11
  61. # 当元素在另一个向量里时的子集
  62. subset(data, subject %in% c(1, 3))
  63. #> subject sex size
  64. #> 1 1 M 7
  65. #> 3 3 F 9
  66. data[data$subject %in% c(1, 3), ]
  67. #> subject sex size
  68. #> 1 1 M 7
  69. #> 3 3 F 9