dplyr中的变异函数不使用滚动平均数/移动平均数
首先也是最重要的是,无论您是否有意见,感谢您抽出时间来查看我的问题 让我分析一下我正在做的事情、示例数据集和错误 我目前拥有的是几个不同ID的数据,这些数据列出了每天的离散度。(您将在下面看到)。我想循环查看日期并向数据中添加两列:滚动表示列和滚动标准偏差列 到目前为止,我编写的代码如下:dplyr中的变异函数不使用滚动平均数/移动平均数,r,dplyr,zoo,R,Dplyr,Zoo,首先也是最重要的是,无论您是否有意见,感谢您抽出时间来查看我的问题 让我分析一下我正在做的事情、示例数据集和错误 我目前拥有的是几个不同ID的数据,这些数据列出了每天的离散度。(您将在下面看到)。我想循环查看日期并向数据中添加两列:滚动表示列和滚动标准偏差列 到目前为止,我编写的代码如下: library(zoo) Testing1 <- function(dataset, k) { ops <- data.frame() for (i in unique(dataset$Dat
library(zoo)
Testing1 <- function(dataset, k) {
ops <- data.frame()
for (i in unique(dataset$Date)) {
ops <- dataset %>% mutate(rolling_mean = rollmean(dataset$Dispersion,k)) %>%
mutate(rolling_std = rollapply(dataset$Dispersion, width = k, FUN = sd))
}
Results <<- ops
}
我想看看
假设您的数据帧名为mydata
,并且Date
列是一个字符:首先转换Date
,然后转换为时间感知TIBLE:
library(dplyr)
library(tibbletime)
mydata <- mydata %>%
mutate(Date = as.Date(Date, "%m/%d/%Y")) %>%
as_tbl_time(index = Date)
库(dplyr)
图书馆(藏书时代)
mydata%
变异(日期=as.Date(日期,“%m/%d/%Y”))%>%
截止时间(索引=日期)
现在您可以定义滚动平均值和sd的函数:
mean_5 <- rollify(mean, window = 5)
sd_5 <- rollify(sd, window = 5)
mydata %>%
mutate(rolling_mean = mean_5(Dispersion),
rolling_std = sd_5(Dispersion))
# A time tibble: 30 x 5
# Index: Date
Identifier Date Dispersion rolling_mean rolling_std
<int> <date> <dbl> <dbl> <dbl>
1 1000 2018-02-15 0.39 NA NA
2 1000 2018-02-16 0.664 NA NA
3 1000 2018-02-17 0.526 NA NA
4 1000 2018-02-18 0.933 NA NA
5 1000 2018-02-19 0.009 0.504 0.342
6 1000 2018-02-20 0.987 0.624 0.393
7 1000 2018-02-21 0.517 0.594 0.394
8 1000 2018-02-22 0.641 0.617 0.393
9 1000 2018-02-23 0.777 0.586 0.367
10 1000 2018-02-24 0.613 0.707 0.182
# ... with 20 more rows
mean_5我想看看
假设您的数据帧名为mydata
,并且Date
列是一个字符:首先转换Date
,然后转换为时间感知TIBLE:
library(dplyr)
library(tibbletime)
mydata <- mydata %>%
mutate(Date = as.Date(Date, "%m/%d/%Y")) %>%
as_tbl_time(index = Date)
库(dplyr)
图书馆(藏书时代)
mydata%
变异(日期=as.Date(日期,“%m/%d/%Y”))%>%
截止时间(索引=日期)
现在您可以定义滚动平均值和sd的函数:
mean_5 <- rollify(mean, window = 5)
sd_5 <- rollify(sd, window = 5)
mydata %>%
mutate(rolling_mean = mean_5(Dispersion),
rolling_std = sd_5(Dispersion))
# A time tibble: 30 x 5
# Index: Date
Identifier Date Dispersion rolling_mean rolling_std
<int> <date> <dbl> <dbl> <dbl>
1 1000 2018-02-15 0.39 NA NA
2 1000 2018-02-16 0.664 NA NA
3 1000 2018-02-17 0.526 NA NA
4 1000 2018-02-18 0.933 NA NA
5 1000 2018-02-19 0.009 0.504 0.342
6 1000 2018-02-20 0.987 0.624 0.393
7 1000 2018-02-21 0.517 0.594 0.394
8 1000 2018-02-22 0.641 0.617 0.393
9 1000 2018-02-23 0.777 0.586 0.367
10 1000 2018-02-24 0.613 0.707 0.182
# ... with 20 more rows
mean_5之所以会出现此错误,是因为滚动平均值/STD的长度与离散长度不匹配。只需在均值/性病向量的开头添加k-1NA
s即可
下面是一个工作示例。您可以根据需要对此进行修改
my_function <- function(df, k) {
df %>%
mutate(
rolling_mean = c(rep(NA, k - 1), rollmean(Dispersion, k)),
rolling_std = c(rep(NA, k - 1), rollapply(Dispersion, width = k, FUN = sd))
)
}
更新@G.Grothendieck的评论:
事实证明,包zoo
已经具备了NA
处理的全面功能,将上述给定代码重构为:
my_function <- function(df, k) {
df %>%
mutate(
rolling_mean = rollmeanr(Dispersion, k, fill = NA),
rolling_std = rollapplyr(Dispersion, width = k, FUN = sd, fill = NA)
)
}
my_函数%
变异(
滚动平均值=滚动平均值(分散度,k,填充=NA),
滚动标准=rollapplyr(分散度,宽度=k,乐趣=sd,填充=NA)
)
}
由于滚动方式/STD的长度与分散长度不匹配,因此会出现此错误。只需在均值/性病向量的开头添加k-1NA
s即可
下面是一个工作示例。您可以根据需要对此进行修改
my_function <- function(df, k) {
df %>%
mutate(
rolling_mean = c(rep(NA, k - 1), rollmean(Dispersion, k)),
rolling_std = c(rep(NA, k - 1), rollapply(Dispersion, width = k, FUN = sd))
)
}
更新@G.Grothendieck的评论:
事实证明,包zoo
已经具备了NA
处理的全面功能,将上述给定代码重构为:
my_function <- function(df, k) {
df %>%
mutate(
rolling_mean = rollmeanr(Dispersion, k, fill = NA),
rolling_std = rollapplyr(Dispersion, width = k, FUN = sd, fill = NA)
)
}
my_函数%
变异(
滚动平均值=滚动平均值(分散度,k,填充=NA),
滚动标准=rollapplyr(分散度,宽度=k,乐趣=sd,填充=NA)
)
}