我需要对表进行重复数据删除,其中行并不完全匹配,但是有一组逻辑标准可以确定两行是否重复。匹配条件示例: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")
答案 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)
清除了同一日期范围内的重复项。
要捕获可能跨越两个日期范围的所有重复项,我对日期范围定义稍有不同的情况下运行了两次。