我有一张房价和销售日期的表。我想使用跑步者套餐计算365天时间范围内的滚动中位数价格。我只希望每个日期一个中间价格。
我的问题是,当我尝试以下代码时,如果某个日期出现多次,则该日期将获得一个以上的中位数价格。这不是我所期望的。我以为如果使用group_by / summarise,每天都会有一个结果。
library(runner)
library(tidyverse)
library(lubridate)
startDate = as_date("2018-01-01")
endDate = as_date("2020-01-01")
# Create data
soldData <- tibble(
price = round(rnorm(100, mean=500000, sd=100000),-3),
date = sample(seq.Date(startDate,endDate,by="days"),100,replace=T))
# Fill in the missing dates between startDate and endDate
soldData <- bind_rows(soldData,anti_join(tibble(date=seq.Date(startDate,endDate,by="day")),soldData)) %>%
arrange(date)
# Find the duplicated dates
duplicatedDates <- soldData[duplicated(soldData$date),]$date
# I thought using group_by/summarise would return one medianPrice per date
results <- soldData %>%
group_by(date) %>%
summarise(medianPrice = runner(
price,
k = "365 days",
idx = date,
f = function(x) {median(x,na.rm=T)}))
# These are the problem rows.
duplicatedResults <- results %>%
filter(date %in% duplicatedDates)
知道我要去哪里哪里吗?
答案 0 :(得分:2)
从dplyr
1.0.0开始,您可以得到从summarise
返回多行的输出。
首先,您需要处理数据中已经存在的重复数据。您想怎么办多次出现的日期?一种方法是采用其中的median
/ mean
。
library(dplyr)
library(runner)
soldData %>%
group_by(date) %>%
summarise(price = median(price, na.rm = TRUE)) -> df
因此,在df
中,每个date
只有一个值。您现在可以应用runner
函数。
df %>%
mutate(medianPrice = runner(price,
k = "365 days",
idx = date,
f = function(x) {median(x,na.rm=T)}))
还有zoo:rollmedianr
可以帮助计算滚动中位数。