微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用亚军包汇总组

如何解决使用亚军包汇总组

我有一张房价和销售日期的表。我想使用跑步者套餐计算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,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)

知道我要去哪里哪里吗?

解决方法

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可以帮助计算滚动中位数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?