假设我具有以下数据框:
df <- data.frame(address=c('654 Peachtree St','890 River Rd','890 River Rd','890 River Rd','1234 Main St','1234 Main St','567 1st Ave','567 1st Ave'), city=c('Atlanta','Eugene','Eugene','Eugene','Portland','Portland','Pittsburgh','Etna'), state=c('GA','OR','OR','OR','OR','OR','PA','PA'), zip5=c('30308','97404','97404','97404','97201','97201','15223','15223'), zip9=c('30308-1929','97404-3253','97404-3253','97404-3253','97201-5717','97201-5000','15223-2105','15223-2105'), stringsAsFactors = FALSE)
`address city state zip5 zip9
1 654 Peachtree St Atlanta GA 30308 30308-1929
2 8910 River Rd Eugene OR 97404 97404-3253
3 8910 River Rd Eugene OR 97404 97404-3253
4 8910 River Rd Eugene OR 97404 97404-3253
5 1234 Main St Portland OR 97201 97201-5717
6 1234 Main St Portland OR 97201 97201-5000
7 567 1st Ave Pittsburgh PA 15223 15223-2105
8 567 1st Ave Etna PA 15223 15223-2105`
我正在考虑将具有匹配地址和zip5的任何行重复。
在R中基于这两列过滤或保留重复项非常简单。我想做的是为每组重复项创建一个带有条件标签的新列,最后得到类似以下内容:
`address city state zip5 zip9 type
1 8910 River Rd Eugene OR 97404 97404-3253 Exact Match
2 8910 River Rd Eugene OR 97404 97404-3253 Exact Match
3 8910 River Rd Eugene OR 97404 97404-3253 Exact Match
4 1234 Main St Portland OR 97201 97201-5717 Different Zip9
5 1234 Main St Portland OR 97201 97201-5000 Different Zip9
6 567 1st Ave Pittsburgh PA 15223 15223-2105 Different City
7 567 1st Ave Etna PA 15223 15223-2105 Different City`
(对于每种重复类型,我也可以使用True / False列。)
我假设解决方案将使用某些mutate + ifelse + boolean代码,但我认为是比较[[within每个重复的子集让我陷入困境...
有什么建议吗?编辑:我不认为这是Find duplicated rows (based on 2 columns) in Data Frame in R的副本。我可以使用该解决方案为每种重复项/ group_by匹配类型创建一个T / F列,但是我正在尝试创建互斥类别。我的条件又如何考虑差异?完全匹配行仅应在“完全匹配”列上显示true,而对于其他所有列则显示false。如果仅通过将不同的列组合输入group_by
来定义列,则完全匹配的行将永远不会返回False。
case_when
的使用将优先考虑较早的选项(即,如果有两个不同的城市归属于一个地址和两个不同的邮政编码,您只会看到有两个不同的城市-您将需要(如果与其他case_when
语句相关,则可以解决此问题)。但是,在这种情况下,如果不需要完美的解决方案,则获取唯一项的长度是一种合理的试探法。]df %>%
group_by(address) %>%
mutate(
match_type = case_when(
all(
length(unique(city)) == 1,
length(unique(state)) == 1,
length(unique(zip5)) == 1,
length(unique(zip9)) == 1) ~ "Exact Match",
length(unique(city)) > 1 ~ "Different City",
length(unique(state)) > 1 ~ "Different State",
length(unique(zip5)) > 1 ~ "Different Zip5",
length(unique(zip9)) > 1 ~ "Different Zip9"
))
否则,您将不得不进行迭代分组(地址+其他变量),并在您提到的布尔列中进行更改。
编辑
df %>% rowid_to_column("ID")
)的添加,然后通过后缀地址将表完全连接到自身(例如suffix = c("a","b")
) ,过滤掉相同的ID并调用exclude(因为每个比较两次),然后可以将mutate的布尔列用于成对比较。根据数据集的大小,它可能会占用过多的计算资源,但是如果您具有合理数量的RAM,它应该可以在几千个的规模上工作。