当组的观察值不足时按组评估滚动平均值
Evaluate rolling mean by group when groups have insufficient observations
我正在尝试计算数据集的一系列滚动方式 -
date name px_last
2012-12-04 A 6.81
2012-12-05 A 4.28
2012-12-06 A 4.32
2012-12-04 A 6.89
2012-12-05 A 7.24
2012-12-04 B 6.81
2012-12-05 B 9.38
2012-12-06 B 3.62
2012-12-04 C 3.85
2012-12-05 C 4.23
2012-12-06 C 7.32
2012-12-04 C 2.84
2012-12-05 C 8.38
这是我正在使用的代码 -
vec = c(2, 3, 4, 5)
for(i in c(1:length(vec))){
varname = paste0("ma", vec[i])
df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
}
我从第三次迭代中得到的错误是 -
Error in mutate_impl(.data, dots) :
Evaluation error: wrong sign in 'by' argument.
据此 post - Clueless about this error: wrong sign in 'by' argument - 我了解到这是因为某些组的行数不足;在这个例子中,分组 name = B
如何在不删除观测值不足的组的情况下计算均值?我希望 NA 最好在由于观察不足而无法计算平均值的地方。
@phil_t 所以问题是 rollapply
试图以 right-aligned
的方式应用 mean
。当在组 B
上的大小为 4 的 window 上尝试这样做时,它只有 3 个值,它正确地失败了。
因此您需要 "regularize" DF 以获得每个组所需的行数。
library(plyr)
> df <- ddply(df, 'name', function(x) {
rbind.fill(x, data.frame(name = rep(unique(x$name), each = max(vec) - nrow(x))))
})
> df
date name px_last
2012-12-04 A 6.81
2012-12-05 A 4.28
2012-12-06 A 4.32
2012-12-04 A 6.89
2012-12-05 A 7.24
2012-12-04 B 6.81
2012-12-05 B 9.38
2012-12-06 B 3.62
<NA> B NA
<NA> B NA
2012-12-04 C 3.85
2012-12-05 C 4.23
2012-12-06 C 7.32
2012-12-04 C 2.84
2012-12-05 C 8.38
> for(i in c(1:length(vec))){
varname = paste0("ma", vec[i])
df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
}
这应该有所帮助。
我正在尝试计算数据集的一系列滚动方式 -
date name px_last
2012-12-04 A 6.81
2012-12-05 A 4.28
2012-12-06 A 4.32
2012-12-04 A 6.89
2012-12-05 A 7.24
2012-12-04 B 6.81
2012-12-05 B 9.38
2012-12-06 B 3.62
2012-12-04 C 3.85
2012-12-05 C 4.23
2012-12-06 C 7.32
2012-12-04 C 2.84
2012-12-05 C 8.38
这是我正在使用的代码 -
vec = c(2, 3, 4, 5)
for(i in c(1:length(vec))){
varname = paste0("ma", vec[i])
df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
}
我从第三次迭代中得到的错误是 -
Error in mutate_impl(.data, dots) :
Evaluation error: wrong sign in 'by' argument.
据此 post - Clueless about this error: wrong sign in 'by' argument - 我了解到这是因为某些组的行数不足;在这个例子中,分组 name = B
如何在不删除观测值不足的组的情况下计算均值?我希望 NA 最好在由于观察不足而无法计算平均值的地方。
@phil_t 所以问题是 rollapply
试图以 right-aligned
的方式应用 mean
。当在组 B
上的大小为 4 的 window 上尝试这样做时,它只有 3 个值,它正确地失败了。
因此您需要 "regularize" DF 以获得每个组所需的行数。
library(plyr)
> df <- ddply(df, 'name', function(x) {
rbind.fill(x, data.frame(name = rep(unique(x$name), each = max(vec) - nrow(x))))
})
> df
date name px_last
2012-12-04 A 6.81
2012-12-05 A 4.28
2012-12-06 A 4.32
2012-12-04 A 6.89
2012-12-05 A 7.24
2012-12-04 B 6.81
2012-12-05 B 9.38
2012-12-06 B 3.62
<NA> B NA
<NA> B NA
2012-12-04 C 3.85
2012-12-05 C 4.23
2012-12-06 C 7.32
2012-12-04 C 2.84
2012-12-05 C 8.38
> for(i in c(1:length(vec))){
varname = paste0("ma", vec[i])
df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
}
这应该有所帮助。