我想找到一种dplyr方法来对接下来的3行取平均值。假设我有一个数据框:
data <- structure(list(x = 1:6, y = c(32.1056789265246, 3.48493686329687, 8.21300282100191, 6.72266588891445, 27.7353607044612, 18.5963631547696)), .Names = c("x", "y"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
A tibble: 6 × 2
x y
<int> <dbl>
1 1 12.8230546
2 2 3.4083329
3 3 0.4825815
4 4 13.6714485
5 5 8.9829427
6 6 2.5997503
我想生成一个新的数据框,其中有3行,第一行是行2,3,4的平均值,接下来是3,4,5,最后一行是4,5,6。
for循环可能是最简单的方法,但如果有更优雅的dplyr方式,我会很感激...谢谢!
答案 0 :(得分:1)
您可以使用rollmean()
包中的zoo
函数与lapply
循环遍历列,如果不需要则删除第一行:
library(zoo)
as.data.frame(lapply(data, rollmean, 3))
# x y
#1 2 14.601206
#2 3 6.140202
#3 4 14.223676
#4 5 17.684797
如果您不需要第一行:
as.data.frame(lapply(data[-1,], rollmean, 3))
# x y
#1 3 6.140202
#2 4 14.223676
#3 5 17.684797
答案 1 :(得分:1)
您可以使用RcppRoll
包执行以下操作:
require(RcppRoll)
roll_mean(data$y[-1], 3) ## 6.140202 14.223676 17.684797
我注意到你确定要找的输出是什么:
require(dplyr)
data %>%
mutate(rmean = roll_meanl(y, 3)) %>%
filter(between(x, 2, 4)) %>%
select(-y)
结果是:
# A tibble: 3 × 2
x rmean
<int> <dbl>
1 2 6.140202
2 3 14.223676
3 4 17.684797
答案 2 :(得分:0)
鉴于你专门询问了dplyr,你可以试试这个:
library(dplyr)
data %>%
mutate(av3 = (lead(y, n=1L) + lead(y, n=2L) + lead(y, n=3L))/3)
创造了:
# A tibble: 6 × 3
x y av3
<int> <dbl> <dbl>
1 1 32.105679 6.140202
2 2 3.484937 14.223676
3 3 8.213003 17.684797
4 4 6.722666 NA
5 5 27.735361 NA
6 6 18.596363 NA