6.4 查找并移除重复记录

6.4 查找并移除重复记录

6.4.1 问题

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

6.4.2 方案

6.4.2.1 向量

## 生成一个向量
set.seed(158)
x <- round(rnorm(20, 10, 5))
x
#>  [1] 14 11  8  4 12  5 10 10  3  3 11  6  0 16  8 10  8
#> [18]  5  6  6

## 对于每一个元素:它是否重复(第一个值不算)
duplicated(x)
#>  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
#>  [9] FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE
#> [17]  TRUE  TRUE  TRUE  TRUE

## 重复条目的值 注意“6”出现了三次,所以它有两个
x[duplicated(x)]
#> [1] 10  3 11  8 10  8  5  6  6

## 重复的条目无需重复出现
unique(x[duplicated(x)])
#> [1] 10  3 11  8  5  6

## 移除重复数据,下面两种方法效果一样:
unique(x)
#>  [1] 14 11  8  4 12  5 10  3  6  0 16
x[!duplicated(x)]
#>  [1] 14 11  8  4 12  5 10  3  6  0 16

6.4.2.2 列表

## 一个样本列表:
df <- read.table(header = TRUE, text = "
 label value
   A     4
   B     3
   C     6
   B     3
   B     1
   A     2
   A     4
   A     4
")

## 每一行是否有重复?
duplicated(df)
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE

## 显示重复的条目
df[duplicated(df), ]
#>   label value
#> 4     B     3
#> 7     A     4
#> 8     A     4

## 显示没有重复的条目 (行名可能不同,但值相同)
unique(df[duplicated(df), ])
#>   label value
#> 4     B     3
#> 7     A     4

## 移除重复的数据,下面两种方法效果一样:
unique(df)
#>   label value
#> 1     A     4
#> 2     B     3
#> 3     C     6
#> 5     B     1
#> 6     A     2
df[!duplicated(df), ]
#>   label value
#> 1     A     4
#> 2     B     3
#> 3     C     6
#> 5     B     1
#> 6     A     2