R dplyr-使用按列分组的rollmean
我有一个数据框,如下所示: (如果数据不符合格式,则查找图像) 我试图计算((7天滚动平均值))3天滚动平均值(前3天和后3天) 基于id、名称、loc的计数字段,但结果不符合预期 查找以下代码:R dplyr-使用按列分组的rollmean,r,R,我有一个数据框,如下所示: (如果数据不符合格式,则查找图像) 我试图计算((7天滚动平均值))3天滚动平均值(前3天和后3天) 基于id、名称、loc的计数字段,但结果不符合预期 查找以下代码: fnrollmean <- function(x) rollmean(df$count,7,na.pad=TRUE,align="center") rollmeandf <- df %>% group_by(id,name,loc) %>% arrange(id,name,l
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))
感谢要使用
mutate
,您必须拥有一个窗口函数,该函数返回与输入到该函数的向量相同的长度向量(或返回一个标量,该标量将被强制为填充有标量值的该长度向量)。问题是您的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)
}
}
给出:
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
打印(结果)
##来源:本地数据帧[9 x 7]
##组:id、名称、位置[2]
##
##日期id名称loc平均计数rollavg
##
##2016年9月6日kar1 AAA 100004 01 NA
##2016年9月8日kar1 AAA 100004 03 NA
##2016年9月3日kar1 AAA 100004 0 4北美
##4.9/10/2016 kar1 AAA 100004 0 5 4.857143
##5 2016年9月11日kar1 AAA 100004 06.000000
##2016年9月12日kar1 AAA 100004 0 7 NA
##2016年9月13日kar1 AAA 100004 08 NA
##2016年9月14日8日kar1 AAA 100004 0 9 NA
##2016年9月7日blr1 BBB 100004 0 2北美
要使用mutate
,必须有一个窗口函数,该函数返回的长度向量与输入到该函数的向量相同(或返回一个标量,该标量将被强制为填充有标量值的该长度向量)。问题是您的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)
}
}
给出:
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
打印(结果)
##来源:本地数据帧[9 x 7]
##组:id、名称、位置[2]
##
##日期id名称loc平均计数rollavg
##
##2016年9月6日kar1 AAA 100004 01 NA
##2016年9月8日kar1 AAA 100004 03 NA
##2016年9月3日kar1 AAA 100004 0 4北美
##4.9/10/2016 kar1 AAA 100004 0 5 4.857143
##5 2016年9月11日kar1 AAA 100004 06.000000
##2016年9月12日kar1 AAA 100004 0 7 NA
##2016年9月13日kar1 AAA 100004 08 NA
##2016年9月14日8日kar1 AAA 100004 0 9 NA
##2016年9月7日blr1 BBB 100004 0 2北美
您的fnrollmean
函数需要使用传递给它的'x'参数(而不是df$count
)。在调用mutate
时,应该使用count
,而不是df$count
。但即使做出这些改变也会产生错误。我对zoo软件包不太熟悉,无法进一步评论。您的fnrollmean
函数需要使用传入它的'x'参数(而不是df$count
)。在调用mutate
时,应该使用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