dplyr中的变异函数不使用滚动平均数/移动平均数

dplyr中的变异函数不使用滚动平均数/移动平均数,r,dplyr,zoo,R,Dplyr,Zoo,首先也是最重要的是,无论您是否有意见,感谢您抽出时间来查看我的问题 让我分析一下我正在做的事情、示例数据集和错误 我目前拥有的是几个不同ID的数据,这些数据列出了每天的离散度。(您将在下面看到)。我想循环查看日期并向数据中添加两列:滚动表示列和滚动标准偏差列 到目前为止,我编写的代码如下: library(zoo) Testing1 <- function(dataset, k) { ops <- data.frame() for (i in unique(dataset$Dat

首先也是最重要的是,无论您是否有意见,感谢您抽出时间来查看我的问题

让我分析一下我正在做的事情、示例数据集和错误

我目前拥有的是几个不同ID的数据,这些数据列出了每天的离散度。(您将在下面看到)。我想循环查看日期并向数据中添加两列:滚动表示列和滚动标准偏差列

到目前为止,我编写的代码如下:

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-1
NA
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-1
NA
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)
)
}