简体   繁体   English

R dplyr - rollmean 使用按列分组

[英]R dplyr - rollmean using group by columns

I have a data frame as below :我有一个数据框如下:

(find image if data is not as per format) (如果数据不符合格式,请查找图像)

Sample Data                     
date    id  name    loc mean    count   mean
9/6/2016    kar1    AAA 100004  0   1   
9/8/2016    kar1    AAA 100004  0   3   
9/9/2016    kar1    AAA 100004  0   4   
9/10/2016   kar1    AAA 100004  0   5   
9/11/2016   kar1    AAA 100004  0   6   
9/12/2016   kar1    AAA 100004  0   7   
9/13/2016   kar1    AAA 100004  0   8   
9/14/2016   kar1    AAA 100004  0   9   
9/7/2016    blr1    BBB 100004  0   2   

am trying to calculate((7 day rolling mean)) 3 day rolling average (previous 3 day and following 3 day) on count field based on id,name,loc but results are not as expected.我正在尝试根据 id、name、loc 在计数字段上计算((7 天滚动平均值))3 天滚动平均值(前 3 天和后 3 天),但结果不符合预期。

find below code:找到以下代码:

fnrollmean <- function(x) rollmean(df$count,7,na.pad=TRUE,align="center")

rollmeandf <- df %>% group_by(id,name,loc) %>% arrange(id,name,loc) %>% mutate(funs=fnrollmean(df$count))

I get error :我得到错误:

Error in eval(substitute(expr), envir, enclos) : incompatible size (9), expecting 8 (the group size) or 1 eval(substitute(expr)、envir、enclos) 中的错误:大小不兼容 (9),需要 8(组大小)或 1

If I just do :如果我只是这样做:

test2 <- df %>% mutate(funs=fnrollmean(df$count))

it works but calculates by considering all disease which is wrong.它有效,但通过考虑所有错误的疾病进行计算。

Please let me know if am missing something or any work around.如果遗漏了什么或任何解决方法,请告诉我。

Expected results:预期成绩:

date    id  name    loc mean    count   mean
9/6/2016    kar1    AAA 100004  0   1   NA
9/8/2016    kar1    AAA 100004  0   3   NA
9/9/2016    kar1    AAA 100004  0   4   NA
9/10/2016   kar1    AAA 100004  0   5   4.8
9/11/2016   kar1    AAA 100004  0   6   6
9/12/2016   kar1    AAA 100004  0   7   NA
9/13/2016   kar1    AAA 100004  0   8   NA
9/14/2016   kar1    AAA 100004  0   9   NA
9/7/2016    blr1    BBB 100004  0   2   NA

图像中的样本数据

Thanks谢谢

To use mutate , you must have a window function that returns the same length vector as the vector(s) that are input to the function (or return a scalar which will be coerced to a vector of that length filled with the scalar value).要使用mutate ,您必须有一个窗口函数,该函数返回与函数输入的向量相同长度的向量(或返回一个标量,该标量将被强制转换为填充了标量值的该长度的向量)。 The issue is that your fnrollmean does not and hence the error.问题是您的fnrollmean没有,因此出现错误。 Notice that the same type of error will remain even after following jdobre's comments with your posted input data because your second group (blr1, BBB, 100004) has only 1 row.请注意,即使在使用您发布的输入数据遵循 jdobre 的评论后,相同类型的错误仍将存在,因为您的第二组(blr1, BBB, 100004)只有1行。 Therefore, modify fnrollmean as:因此,将fnrollmean修改为:

library(zoo)
fnrollmean <- function (x) {
  if (length(x) < 7) {
    rep(NA,length(x)) 
  } else {
    rollmean(x,7,align="center",na.pad=TRUE)
  }
}

Note that we followed jdobre's comment to use x instead of df$count within the function.请注意,我们按照 jdobre 的注释在函数中使用x而不是df$count Then (again following jdobre's comment to use count instead of df$count when calling fnrollmean within mutate ):然后(再次遵循 jdobre 的评论,在mutate调用fnrollmean时使用count而不是df$count ):

library(dplyr)
result <- df %>% group_by(id,name,loc) %>% 
                 mutate(rollavg=fnrollmean(count))

gives:给出:

print(result)
##Source: local data frame [9 x 7]
##Groups: id, name, loc [2]
##
##       date     id   name    loc  mean count  rollavg
##     <fctr> <fctr> <fctr>  <int> <int> <int>    <dbl>
##1  9/6/2016   kar1    AAA 100004     0     1       NA
##2  9/8/2016   kar1    AAA 100004     0     3       NA
##3  9/9/2016   kar1    AAA 100004     0     4       NA
##4 9/10/2016   kar1    AAA 100004     0     5 4.857143
##5 9/11/2016   kar1    AAA 100004     0     6 6.000000
##6 9/12/2016   kar1    AAA 100004     0     7       NA
##7 9/13/2016   kar1    AAA 100004     0     8       NA
##8 9/14/2016   kar1    AAA 100004     0     9       NA
##9  9/7/2016   blr1    BBB 100004     0     2       NA

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM