【问题标题】:Deduplication of data using multiple columns in R在 R 中使用多列对数据进行重复数据删除
【发布时间】:2019-06-02 16:32:24
【问题描述】:

我需要对行不完全匹配但有一组逻辑标准可以确定两行是否重复的表进行重复数据删除。匹配条件示例: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")

【问题讨论】:

  • 我会创建一个额外的 TRUE/FALSE 列来检查所有这些条件,然后根据该新列进行过滤
  • @RAB 当您必须将每一行与其他每一行进行比较时,这将如何工作?
  • 您可以添加dput 的数据框吗?
  • @RonakShah 如果编辑添加了您要查找的内容,请告诉我

标签: r duplicates


【解决方案1】:

编辑 #2:找到解决方案

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

为了捕获可能跨越两个日期范围的任何重复项,我运行了两次,但日期范围定义略有不同。

【讨论】:

    【解决方案2】:

    我们可以在filter 中使用duplicated

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

    【讨论】:

    • 谢谢@akrun。您是否也看到了包含日期接近匹配的方法?即匹配记录后 8 天内closeDate。此外,这似乎与我上面给出的示例非常相似:data &lt;- distinct(data, tolower(substr(data$address,1,10)), salePrice, .keep_all = TRUE)。主要区别是什么?
    • 我在按照您的代码思路进行思考。由于某种原因,您为这些行提到的 8 天差异不匹配。你能检查一下吗
    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多