作为previous one中same project的后续问题:
我发现房地产通常以存货时间来衡量,存货时间定义为(活跃挂牌数量)/(每月房屋销售数量,以过去12个月的平均值表示)。在每次房屋销售之前,我能找到的计算过去12个月内房屋销售数量的最佳方法是通过循环。
homesales$yearlysales = 0
for (i in 1:nrow(homesales))
{
sdt = as.Date(homesales$saledate[i])
x <- homesales %>% filter( sdt - saledate >= 0 & sdt - saledate < 365) %>% summarise(count=n())
homesales$yearlysales[i] =x$count[1]
}
homesales$inventorytime = homesales$inventory / homesales$yearlysales * 12
homesales$inventorytime[is.na(homesales$saledate)] = NA
homesales$inventorytime[homesales$yearlysales==0] = NA
很明显(?),R语言对使用for循环进行这种类型的选择有一些偏见。有更好的方法吗?
附录1.数据表结构
address, listingdate, saledate
101 Street, 2017/01/01, 2017/06/06
106 Street, 2017/03/01, 2017/08/11
102 Street, 2017/05/04, 2017/06/13
109 Street, 2017/07/04, 2017/11/24
...
附录2。我正在寻找的输出类似于this。
答案 0 :(得分:0)
以下提供了给定日期的活动列表数量:
library(tidyverse)
library(lubridate)
tmp <- tempfile()
download.file("https://raw.githubusercontent.com/robhanssen/glenlake-homesales/master/homesalesdata-source.csv", tmp)
data <- read_csv(tmp) %>%
select(ends_with("date")) %>%
mutate(across(everything(), mdy)) %>%
pivot_longer(cols = everything(), names_to = "activity", values_to ="date", names_pattern = "(.*)date")
active <- data %>%
mutate(active = if_else(activity == "listing", 1, -1)) %>%
arrange(date) %>%
mutate(active = cumsum(active)) %>%
group_by(date) %>%
filter(row_number() == n()) %>%
select(-activity)
tibble(date = seq(min(data$date, na.rm = TRUE), max(data$date, na.rm = TRUE), by = "days")) %>%
left_join(active) %>%
fill(active)
基本上,我们将处理时间延长,将每行数据分为两行,以表示不同的活动:添加列表或删除列表。然后,这的累加总和便会为您提供活动列表的数量。
注意,这假设您没有丢失任何数据。根据制作csv的规范,开始或结束时可能会缺少活动。但这是关于csv本身的警告。
活动列表是关于时间的事实。销售是一个时期的事实。您可能希望按月汇总销售,然后使用该月最后一天的活动列表数,或者该月的平均列表数。