【问题标题】:R: function for home inventory count?R:家庭库存盘点功能?
【发布时间】:2020-08-24 20:00:39
【问题描述】:

我有一个我所在社区的房屋销售数据列表,列为

地址,上市日期,销售日期 101街, 2017/01/01, 2017/06/06 106街, 2017/03/01, 2017/08/11 102街, 2017/05/04, 2017/06/13 109街, 2017/07/04, 2017/11/24 ...

我想计算在挂牌日期挂牌出售(和未售出)的房屋数量,以及查看房屋销售和挂牌在一年中的变化情况。

在示例中:

地址、上市日期、销售日期、库存 101街, 2017/01/01, 2017/06/06, 1 106街, 2017/03/01, 2017/08/11, 2 102街, 2017/05/04, 2017/06/13, 3 109街, 2017/07/04, 2017/11/24, 2 ...

例如109 街上市时只有 106 和 109 街在售。

是否有一个简单的 1 步 R 表达式可以计算?

【问题讨论】:

    标签: r


    【解决方案1】:

    我想这是 3 个简单的步骤。我只是设置标准,我相信其他人可以通过它。

    library(data.table)
    library(lubridate)
    dt <- data.table(
      address = paste(c(101,106,102,109),"Street"),
      listing_date = ymd(c('2017/01/01','2017/03/01','2017/05/04','2017/07/04')),
      saledate = ymd(c("2017/06/06","2017/08/11","2017/06/13","2017/11/24")),
      key = 'listing_date'))
    
    dt2 <- rbind(dt[,.(date = listing_date, x = 1)], dt[,.(date = saledate, x = -1)])
    dt3 <- dt2[, .(x = sum(x)), keyby = date][, .(date, inventory = cumsum(x))]
    dt[, inventory := dt3[dt, on=c('date' = 'listing_date'), inventory]]
    

    或者改为单线

    dt[,inventory:=dt[,.(d=listing_date:saledate),.(address)][,.N,key=d][dt,N]]
    dt[]
    #>       address listing_date   saledate inventory
    #> 1: 101 Street   2017-01-01 2017-06-06         1
    #> 2: 106 Street   2017-03-01 2017-08-11         2
    #> 3: 102 Street   2017-05-04 2017-06-13         3
    #> 4: 109 Street   2017-07-04 2017-11-24         2
    

    【讨论】:

      【解决方案2】:

      由于data.table和tibbles之间的不兼容,我无法使用具体的解决方案,但通用算法非常有启发性。我可以通过一些更改将总体思路转化为 tidyverse 土地

      # import data from data file
      
      homesale_file = "Home sales data.csv"
      homesales <- read_csv(homesale_file, 
              col_types = cols(listingdate = col_date(format = "%m/%d/%Y"), 
                               saledate = col_date(format = "%m/%d/%Y")
                               )
                          )
      
      #
      # calculation for inventory
      #
      
      listingdate <- tibble(address=homesales$address, listingdate=homesales$listingdate, type="listing",y=1)
      saledate <- tibble(address=homesales$address, listingdate=homesales$saledate, type="sale", y=-1)
      summation = bind_rows(listingdate, saledate) %>% arrange(listingdate) %>% mutate(inventory=cumsum(y)) %>% select(-y) %>% filter(type=="listing")
      homesales <- homesales %>% inner_join(summation) %>% select(-type)
      

      @pseudopin,感谢您的帮助!

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多