R-根据数据框架中的两个标准删除行



我有一个带有家庭销售和12000个obs和20个变量的数据框架。我试图在彼此30天内删除任何具有相同地址和销售日期的销售。原因是对数据的目视检查揭示了彼此销售的30天内这些"重复"销售可能是MLS记录错误。因此,我没有将它们包括在回归分析中。在创建销售日标准的范围时,我将日期作为数字提供了帮助。这是我的数据框架的两个相关列:

Address      SellingDat
120 N.Main   41540
305 S.Hill   42530
2243 Ridge   40002
120 N.Main   41530

我试图在彼此30天内找到所有具有销售日期的重复地址,然后将其从数据框架中删除

到目前为止,我已经尝试使用以下内容,但除了创建具有唯一值的新数据框架外,还不完全了解它在做什么。

data2 <- ddply(data, .(Address, SellingDat), unique)

任何提示或建议将不胜感激。我已经阅读了与此相关的讨论,但还没有找到任何可以根据自己的尝试来弄清楚如何应用的内容。我是R中的新手,比任何东西都想了解代码的工作原理,而不仅仅是有效的代码。谢谢!

您对我的评论的回答使这非常容易。这是一些稍大的样本数据:

data = data.frame(
    Address = c('a', 'b', 'b', 'b', 'b', 'c', 'c', 'd', 'd'),
    SellingDat = c(1, 1, 10, 50, 90, 10, 20, 1, 100)
)
data
#   Address SellingDat
# 1       a          1
# 2       b          1
# 3       b         10
# 4       b         50
# 5       b         90
# 6       c         10
# 7       c         20
# 8       d          1
# 9       d        100

然后,我们可以使用dplyr通过地址计算上一个销售日期的差异。然后,我们过滤以将行只保留在上一个和下一个销售日期的位置超过30天以上。

library(dplyr)
data %>% group_by(Address) %>%
    arrange(SellingDat) %>%
    mutate(time_to_next = c(diff(SellingDat), NA),
           time_from_last = c(NA, diff(SellingDat))) %>%
    filter(coalesce(time_to_next, Inf) > 30 & coalesce(time_from_last, Inf) > 30) %>%
    select(-time_to_next, -time_from_last) %>%
    arrange(Address, SellingDat)
# Source: local data frame [5 x 2]
# Groups: Address [3]
# 
#   Address SellingDat
#    <fctr>      <dbl>
# 1       a          1
# 2       b         50
# 3       b         90
# 4       d          1
# 5       d        100

colesce替代了缺失值,因此我与Inf合并以确保保留缺失值。

最新更新