在dplyr中平均接下来的n行,R

时间:2016-09-06 14:13:13

标签: r dplyr

我想找到一种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方式,我会很感激...谢谢!

3 个答案:

答案 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