2016-09-09 65 views
-2

我有如下的数据帧列:- [R dplyr - rollmean使用组由

(找到图像,如果数据不是按格式)

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 

正尝试计算((第7天轧制平均值))基于id,name,loc计数字段的3天滚动平均值(前3天和后3天) 但结果不符合预期。

发现下面的代码:

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)) 

我得到错误:

错误的eval(替代(表达式),ENVIR,enclos):不兼容的尺寸 (9),预计8(组大小)或1

如果我只是做:

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

它的工作原理是通过考虑所有错误的疾病来计算。

请让我知道如果我错过了什么或任何工作。

预期结果:

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 

sample data in image

由于

+0

你'fnrollmean'功能需要使用传递的 'X' 的说法进入它(而不是'df $ count')。在你调用'mutate'时,你应该使用'count',而不是'df $ count'。但即使进行这些更改仍会产生错误。我对_zoo_软件包的进一步评论不够熟悉。 – jdobres

回答

2

要使用mutate,必须有一个返回相同的长度矢量作为输入到矢量(S)的窗口函数该函数(或返回一个标量,该标量将被强制为一个具有标量值的长度的向量)。问题是你的fnrollmean没有,因此错误。请注意,即使在发布输入数据后跟踪jdobre的评论,也会保留相同类型的错误,因为第二组(blr1, BBB, 100004)只有1行。因此,修改fnrollmean为:

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

请注意,我们跟着jdobre的评论使用x代替df$count函数内。然后,(再次下jdobre的评论中mutate调用fnrollmean时使用count,而不是df$count):

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

给出:

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 
+0

谢谢Aichao ...它的工作.. – Ckeng

+0

如果它的工作,你应该接受这个答案,让人们知道这个问题已经得到解答。 :) – Ajar