使用 R 一次在多列中查找重复项

sre*_*eed 4 r duplicates

我有一个包含三列的表格:姓氏、名字和地址。我希望通过搜索具有相同姓氏和相同地址的人来匹配家庭。我想出了如何使用 Duplicated 过滤到仅具有相同名称或相同地址的人。这是我的示例表:

Surname First Name  Address
A1        Bobby       X1
B5         Joe        X2
B5        Mary        X3
F2        Lou         X4
F3        Sarah       X5
G4        Bobby       X6
G4        Fred        X6
G4        Anna        X6
H5        Eric        X7
K6        Peter       X8 
Run Code Online (Sandbox Code Playgroud)

我用来过滤它的代码是:

duplicates = duplicated(sample$Surname)
sample_surnames= sample %>% filter(duplicates)
Run Code Online (Sandbox Code Playgroud)

这是该代码的输出:

Surname First Name  Address         
B5        Mary        X3
G4        Fred        X6
G4        Anna        X6
Run Code Online (Sandbox Code Playgroud)

问题有两个方面:

  1. 此代码删除任何重复项的第一个实例。即 Bobby、Fred 和 Anna 都应该包括在内,但 Bobby 被删除。
  2. 有没有办法同时过滤 Surname 和 Address 列中的重复项,还是需要执行两次操作?需要明确的是:我正在寻找在 BOTH 列中有重复的实例。

更新:这是我最终想要得到的表格:请注意,我不是要删除重复项,而是保留重复项。在这种情况下,Bobby、Fred 和 Anna 是唯一具有相同姓氏地址的人。

Surname First Name  Address
G4       Bobby       X6
G4        Fred       X6
G4       Anna        X6
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以使用uniquewith byoption fromdata.table

library(data.table)
unique(setDT(df), by = c("Surname", "Address"))
#    Surname First Name Address
#1:      A1      Bobby      X1
#2:      B5        Joe      X2
#3:      B5       Mary      X3
#4:      F2        Lou      X4
#5:      F3      Sarah      X5
#6:      G4      Bobby      X6
#7:      H5       Eric      X7
#8:      K6      Peter      X8
Run Code Online (Sandbox Code Playgroud)

或与 tidyverse

library(dplyr)
df %>% 
  distinct(Surname, Address, .keep_all = TRUE)
# Surname First Name Address
#1      A1      Bobby      X1
#2      B5        Joe      X2
#3      B5       Mary      X3
#4      F2        Lou      X4
#5      F3      Sarah      X5
#6      G4      Bobby      X6
#7      H5       Eric      X7
#8      K6      Peter      X8
Run Code Online (Sandbox Code Playgroud)

更新

基于更新的帖子,也许这有帮助

setDT(df)[, if((uniqueN(FirstName))>1) .SD,.(Surname, Address)]
#   Surname Address FirstName
#1:      G4      X6     Bobby
#2:      G4      X6      Fred
#3:      G4      X6      Anna
Run Code Online (Sandbox Code Playgroud)

  • 那行得通!您真棒。谢谢!现在,要弄清楚代码的实际含义...... (2认同)