r - Dplyr groupby 名称和最近 n 个事件的滚动平均值(按日期)
问题描述
我想创建一个人(姓名)的最后 3 个事件的滚动平均值。我有我想使用最近的 3 个事件的日期。有些人可能DF
比其他人少,这没关系。
创建数据框的代码:
library(dplyr)
# Create DataFrame
df<- data.frame(name=c('CAREY.FAKE','CAREY.FAKE','CAREY.FAKE','CAREY.FAKE','CAREY.FAKE','CAREY.FAKE',
'JOHN.SMITH','JOHN.SMITH','JOHN.SMITH','JOHN.SMITH','JOHN.SMITH','JOHN.SMITH',
'JEFF.JOHNSON','JEFF.JOHNSON','JEFF.JOHNSON','JEFF.JOHNSON',
'SARA.JOHNSON','SARA.JOHNSON','SARA.JOHNSON','SARA.JOHNSON'
),
GA=c(2,2,2,2,2,20,2,2,2,2,2,20,2,2,2,20,2,2,2,20),
SV=c(2,2,2,2,2,20,2,2,2,2,2,20,2,2,2,20,2,2,2,20),
GF=c(2,2,2,2,2,20,2,2,2,2,2,20,2,2,2,20,2,2,2,20),
SA=c(2,2,2,2,2,20,2,2,2,2,2,20,2,2,2,20,2,2,2,20),
date=c("10/20/2016","10/19/2016","10/18/2016","10/17/2016","10/16/2016","10/15/2016",
"10/20/2016","10/19/2016","10/18/2016","10/17/2016","10/16/2016","10/15/2016",
"10/20/2016","10/19/2016","10/18/2016","10/17/2016",
"10/20/2016","10/19/2016","10/18/2016","10/17/2016"
),
stringsAsFactors = FALSE)
东风:
name GA SV GF SA date
CAREY.FAKE 2 2 2 2 10/20/2016
CAREY.FAKE 2 2 2 2 10/19/2016
CAREY.FAKE 2 2 2 2 10/18/2016
CAREY.FAKE 2 2 2 2 10/17/2016
CAREY.FAKE 2 2 2 2 10/16/2016
CAREY.FAKE 20 20 20 20 10/15/2016
JOHN.SMITH 2 2 2 2 10/20/2016
JOHN.SMITH 2 2 2 2 10/19/2016
JOHN.SMITH 2 2 2 2 10/18/2016
JOHN.SMITH 2 2 2 2 10/17/2016
JOHN.SMITH 2 2 2 2 10/16/2016
JOHN.SMITH 20 20 20 20 10/15/2016
JEFF.JOHNS 2 2 2 2 10/20/2016
JEFF.JOHNS 2 2 2 2 10/19/2016
JEFF.JOHNS 2 2 2 2 10/18/2016
JEFF.JOHNS 20 20 20 20 10/17/2016
SARA.JOHNS 2 2 2 2 10/20/2016
SARA.JOHNS 2 2 2 2 10/19/2016
SARA.JOHNS 2 2 2 2 10/18/2016
SARA.JOHNS 20 20 20 20 10/17/2016
创建滚动平均值的代码:
df_next <- df %>%
group_by(name) %>%
summarise(last_three_mean = mean(tail(GA,SV,GF,SA, 3))
错误:
Error in summarise_impl(.data, dots) :
Evaluation error: length(n) == 1L is not TRUE.
期望的结果:
name GA SV GF SA
CAREY.FAKE 2 2 2 2
JEFF.JOHNS 2 2 2 2
JOHN.SMITH 2 2 2 2
SARA.JOHNS 2 2 2 2
解决方案
我们可以arrange
通过'Date'然后使用'name'分组后summarise_at
获取mean
多个列的
library(dplyr)
library(lubridate)
df %>%
group_by(name) %>%
arrange(name, mdy(date)) %>%
summarise_at(2:5, funs(mean(tail(., 3))))
#or select the column by matching the name pattern
#summarise_at(vars(matches("^[A-Z]{2}$")), funs(mean(tail(., 3))))
# A tibble: 4 x 5
# name GA SV GF SA
# <chr> <dbl> <dbl> <dbl> <dbl>
#1 CAREY.FAKE 2 2 2 2
#2 JEFF.JOHNSON 2 2 2 2
#3 JOHN.SMITH 2 2 2 2
#4 SARA.JOHNSON 2 2 2 2
或者另一种选择是利用top_n
然后做summarise_at
df %>%
group_by(name) %>%
top_n(mdy(date), n = 3) %>%
summarise_at(2:5, mean)
推荐阅读
- android - Swipable 在 Android 中不起作用(Expo Cli)
- python - pytorch CNN 模型中的 BatchNorm2d 错误
- python - 双向 LSTM 合并模式解释
- javascript - 从 msql 获取数据到 selectpickers 进行编辑
- sql - 从子查询中按客户客户分组的日历计数在按月显示活动客户的结果中
- c++ - C++ 输出没有小数点。我想知道我哪里做错了
- spring-boot - 如何在 Springboot 中接收来自 Websocket 单元测试的响应
- javascript - 如何使用javascript更改网站中的语言
- selenium - 使用 xpath 轴识别动态表中的 Xpath
- r - 使用 R 从谷歌驱动器中的特定位置获取文件/文件夹列表