6.4 查找并移除重复记录

6.4.1 问题

你想查找和(或)移除向量或列表里重复的条目。

6.4.2 方案

6.4.2.1 向量

  1. # 生成一个向量
  2. set.seed(158)
  3. x <- round(rnorm(20, 10, 5))
  4. x
  5. #> [1] 14 11 8 4 12 5 10 10 3 3 11 6 0 16 8 10 8
  6. #> [18] 5 6 6
  7. # 对于每一个元素:它是否重复(第一个值不算)
  8. duplicated(x)
  9. #> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
  10. #> [9] FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE
  11. #> [17] TRUE TRUE TRUE TRUE
  12. # 重复条目的值 注意“6”出现了三次,所以它有两个
  13. x[duplicated(x)]
  14. #> [1] 10 3 11 8 10 8 5 6 6
  15. # 重复的条目无需重复出现
  16. unique(x[duplicated(x)])
  17. #> [1] 10 3 11 8 5 6
  18. # 移除重复数据,下面两种方法效果一样:
  19. unique(x)
  20. #> [1] 14 11 8 4 12 5 10 3 6 0 16
  21. x[!duplicated(x)]
  22. #> [1] 14 11 8 4 12 5 10 3 6 0 16

6.4.2.2 列表

  1. # 一个样本列表:
  2. df <- read.table(header = TRUE, text = "
  3. label value
  4. A 4
  5. B 3
  6. C 6
  7. B 3
  8. B 1
  9. A 2
  10. A 4
  11. A 4
  12. ")
  13. # 每一行是否有重复?
  14. duplicated(df)
  15. #> [1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE
  16. # 显示重复的条目
  17. df[duplicated(df), ]
  18. #> label value
  19. #> 4 B 3
  20. #> 7 A 4
  21. #> 8 A 4
  22. # 显示没有重复的条目 (行名可能不同,但值相同)
  23. unique(df[duplicated(df), ])
  24. #> label value
  25. #> 4 B 3
  26. #> 7 A 4
  27. # 移除重复的数据,下面两种方法效果一样:
  28. unique(df)
  29. #> label value
  30. #> 1 A 4
  31. #> 2 B 3
  32. #> 3 C 6
  33. #> 5 B 1
  34. #> 6 A 2
  35. df[!duplicated(df), ]
  36. #> label value
  37. #> 1 A 4
  38. #> 2 B 3
  39. #> 3 C 6
  40. #> 5 B 1
  41. #> 6 A 2