R中重复项的分类

问题描述 投票:0回答:2

假设我具有以下数据框:

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。

r dataframe dplyr duplicates conditional-statements
2个回答
0
投票
我认为关键字是按“引用”变量分组的,这里的地址很有意义,然后您可以计算该向量中唯一项的数量。这不是一个完美的解决方案,因为我对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" ))

否则,您将不得不进行迭代分组(地址+其他变量),并在您提到的布尔列中进行更改。 

编辑

我刚刚想到的另一种方法,如果您需要更精细的解决方案,那就是利用id列(df %>% rowid_to_column("ID"))的添加,然后通过后缀地址将表完全连接到自身(例如suffix = c("a","b")) ,过滤掉相同的ID并调用exclude(因为每个比较两次),然后可以将mutate的布尔列用于成对比较。根据数据集的大小,它可能会占用过多的计算资源,但是如果您具有合理数量的RAM,它应该可以在几千个的规模上工作。


0
投票
必须有一种更简单的方法,因为这涉及到很多步骤才能将数据精化到所需的输出中,但是在有人提供它之前,您可以尝试以下操作。
© www.soinside.com 2019 - 2024. All rights reserved.