【发布时间】:2020-09-22 08:56:24
【问题描述】:
我有两个数据框:sold1 和 sold。
他们都持有已售房价的数据,但来源不同。事实证明,即使是同一属性,数据也可能不匹配。
我想将 Sold1 中的每个元素与 Sold2 进行比较,并排除 Sold1 中已存在(重复)在 sold2 中的元素。
在这种情况下,对“重复”的测试将是以下各项的组合:
- Sold1.price 与 Sold2.price 相差 10% 以内
- Sold2.address 包含在 Sold1.address 中
- Sold2.dateOfSale 不早于 Sold1.dateOfSale
两个问题:
- 为什么在函数中访问“价格”字段时会更改类?
- 有没有更优雅的方法来做到这一点,而无需使用两次 apply(在两个大型数据帧上非常慢)?
sold1 <- data.frame(
price = c(100000,150000,200000,250000,300000,400000),
address = c("Widmore Road, Bromley", "River Quaggy Apartments", "Meadowcroft Way, Orwell, SG8","Freelands Road, Bromley","Nascot Street, London, W12","Priory Terrace, South Hampstead, NW6"),
dateOfSale = c(as.Date("2020-01-01"),as.Date("2020-02-03"),as.Date("2020-03-05"),as.Date("2020-04-06"),as.Date("2020-05-08"),as.Date("2020-06-12"))
)
sold2 <- data.frame(
price = c(100000,150000,210000,251000,300000),
address = c("Random Road, Bromley", "Random2 Road Apartments", "Meadowcroft Way","Freelands Road","Random street London, W12"),
dateOfSale = c(as.Date("2020-01-01"),as.Date("2020-04-03"),as.Date("2020-03-25"),as.Date("2020-04-26"),as.Date("2019-05-08"))
)
FLR_Check_Match <- function (s2, s1row) {
checkRes = TRUE
# Price within tolerance
checkRes = checkRes && as.numeric(s1row["price"]) >= as.numeric(s2["price"]) * .9 && as.numeric(s1row["price"]) <= as.numeric(s2["price"]) * 1.1
# address close match
checkRes = checkRes && grepl(s2["address"], s1row["address"], ignore.case = TRUE)
# date of sale falls 7 weeks after date of sale in the sold1 (s1) data
checkRes = checkRes && as.Date(s2["dateOfSale"]) >= as.Date(s1row["dateOfSale"])
return(checkRes)
}
FCheck_Sold_Dups <- function(s1, s2) {
print(class(s1["price"])) #character
#For each element in s2, check whether there is a match to s1
excV <- apply(s2, 1, FLR_Check_Match, s1)
result <- any(excV)
return(result)
}
sold1$exclude <- apply(sold1,1,FCheck_Sold_Dups,sold2)
【问题讨论】:
-
代码对你有用吗?当我运行
sold1$exclude <- apply(sold1,1,FCheck_Sold_Dups,sold2)它返回s2["price"] * 0.9 : non-numeric argument to binary operator -
不——这是问题之一。当使用 as.numeric() 进行转换时,该错误被消除。但是我不明白为什么在函数中访问向量的类/类型时会发生变化。
-
@Ronak,我已经修改以反映 as.numeric/as.Date。它现在有效,但同样的问题也适用。
标签: r