R - 根据数据框中的两个条件删除行
R - removing rows based on two criteria in data frame
我有一个包含房屋销售和 12000 个 obs 和 20 个变量的数据框。我试图删除彼此相隔 30 天内具有相同地址和销售日期的任何销售。原因是对数据的目视检查显示这些 "duplicate" 销售在 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
来计算Address 与上一个和下一个销售日期的差异。然后我们过滤以仅保留上一个和下一个销售日期相隔 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
合并替换缺失值,因此我使用 Inf
合并以确保保留缺失值。
我有一个包含房屋销售和 12000 个 obs 和 20 个变量的数据框。我试图删除彼此相隔 30 天内具有相同地址和销售日期的任何销售。原因是对数据的目视检查显示这些 "duplicate" 销售在 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
来计算Address 与上一个和下一个销售日期的差异。然后我们过滤以仅保留上一个和下一个销售日期相隔 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
合并替换缺失值,因此我使用 Inf
合并以确保保留缺失值。