R:每次销售前的去年房屋销售

时间:2020-09-21 16:50:30

标签: r

作为previous onesame 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

1 个答案:

答案 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本身的警告。

活动列表是关于时间的事实。销售是一个时期的事实。您可能希望按月汇总销售,然后使用该月最后一天的活动列表数,或者该月的平均列表数。