R - 根据数据框中的两个条件删除行

时间:2017-03-09 17:15:53

标签: r duplicates plyr

我有一个家庭销售数据框和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的新手,并且比任何想要学习代码如何工作的东西更多,而不仅仅是有一段有效的代码。谢谢!

1 个答案:

答案 0 :(得分:0)

您对我的评论的回复让这很容易。这是一些略大的样本数据:

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

Coalesce替换缺失值,因此我与Inf合并以确保保留缺失值。