使用R中的多列进行重复数据删除

时间:2019-01-08 01:19:09

标签: r duplicates

我需要对表进行重复数据删除,其中行并不完全匹配,但是有一组逻辑标准可以确定两行是否重复。匹配条件示例:address列匹配项的前10个字符和salePrice列匹配项是完全匹配的,并且closeDate属于8天范围。

在这些数据集中,使用这些条件,第2行和第3行是重复项,第10行和第11行是重复项:

                                      address           city        county     houseSize lotSize salePrice closeDate pricePerFoot DOM
1                              1224 Hawkhurst Place     San Jose  Santa Clara      2022    3724    847500   7/24/17          419  50
2                                1224 Marionola Way       PINOLE Contra Costa      1228    1000    390000    7/9/18          318  41
3                                 1224 Marionola Wy       PINOLE Contra Costa      1228    1000    390000    7/3/18          318  NA
4                           1224 Rockledge Ln Apt 8 WALNUT CREEK Contra Costa      1054       0    374000   6/21/18          355   6
5                        1224 Singingwood Ct. Apt 3 WALNUT CREEK Contra Costa      1054       0    370000   9/26/18          351   6
6                             1225 Mente Linda Loop     Milpitas  Santa Clara      1371     435    800000  10/23/17          584  29
7                         1225 Oak Grove Avenue, Apt1   Burlingame    San Mateo      1814   10425   1498000  11/19/18          826  11
8                         1225 Singingwood Ct Apt 2 WALNUT CREEK Contra Costa       733       0    290000   7/12/18          341  19
9                         1225 Singingwood Ct Apt 4 WALNUT CREEK Contra Costa       733       0    290000   5/30/18          396   5
10                           1226 Creekside Way, Apt 5     Milpitas  Santa Clara      1522    1524   1015000  11/30/17          667   2
11                      1226 Creekside Way  , Apt 5     Milpitas  Santa Clara      1522    1524   1015000  11/30/17          667  NA
12                       1226 El Camino Real , Unit 201   Burlingame    San Mateo      1640   12912   1450000  10/18/18          884  12

我不太了解如何到达那里。用肉眼看到重复的图像并不难,但是要进行40,000多个记录,我想找到一个更优雅的解决方案。

我在不包含公寓号码的数据集上使用了以下内容:

data <- distinct(data, tolower(substr(data$address,1,10)), salePrice, .keep_all = TRUE)

但是这会遇到麻烦,address的前15个以上的字符匹配,但是末尾的单元号不同,如示例数据中的第8和9行。

编辑:回答对deput的请求-这是您所需要的吗?

    structure(list(address = structure(1:6, .Label = c("1224 Hawkhurst Place", 
"1224 Marionola Way", "1224 Marionola Wy", "1224 Rockledge Ln Apt 8", 
"1224 Singingwood Ct. Apt 3", "1225 Mente Linda Loop", "1225 Oak Grove Avenue, #1", 
"1225 Singingwood Ct Apt 2", "1225 Singingwood Ct Apt 4", "1226 Creekside Way  , Apt 5", 
"1226 Creekside Way, #5", "1226 El Camino Real , #201", "1226 Hawkhurst Place", 
"1226 Nestwood Way", "1226 Shelter Bay Ave, Mill Valley, CA 94941-3020", 
"1227 Chantel Way", "1227 Culet Ranch Rd", "1227 Shelter Bay Ave, Mill Valley, CA 94941-3086"
), class = "factor"), salePrice = c(847500L, 390000L, 390000L, 
374000L, 370000L, 800000L), closeDate = structure(c(13L, 15L, 
14L, 11L, 17L, 3L), .Label = c("10/18/18", "10/2/18", "10/23/17", 
"11/19/18", "11/30/17", "12/14/18", "12/21/17", "4/21/17", "4/23/18", 
"5/30/18", "6/21/18", "7/12/18", "7/24/17", "7/3/18", "7/9/18", 
"8/22/17", "9/26/18"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

2 个答案:

答案 0 :(得分:0)

我们可以在duplicated中使用filter

library(dplyr)
data %>% 
   filter(!duplicated(cbind(substr(address, 1, 10), salePrice)))

答案 1 :(得分:0)

编辑#2:找到了解决方案

我能够通过创建一个新列dateGroup并根据定义的范围(例如,2017年1月1日至1日之间的saleDate)的字母值来处理接近但不准确的日期/ 30/2017被分配为splitGroup“ a”)。然后,我使用data <- distinct(data, tolower(substr(data$address,1,10)), salePrice, splitGroup, .keep_all = TRUE)清除了同一日期范围内的重复项。

要捕获可能跨越两个日期范围的所有重复项,我对日期范围定义稍有不同的情况下运行了两次。