首页 > 解决方案 > 使用 dplyr::mutate() 获取选定列的滚动平均值

问题描述

我想使用 dplyr 在新列中的每最后 2 行中获取滚动方式。让我们以 mtcars 作为示例数据。我会将行名转换为新列,以更好地表示我的真实数据集(第一列中有日期)

df = tibble::rownames_to_column(mtcars, "exclude")

现在我想要一个新列,它给出每最后两行的滚动平均值(假设现在包含汽车名称的“排除”列实际上包含日期)。应该是输出:

df

我试图用 dplyr::mutate() 和 cross() 来做到这一点,但我没有设法这样做。

更重要的是,有时我可能不得不为之前的许多行计算这些滚动行均值,比如 13 行左右。

谢谢和最美好的祝愿!

标签: rselectdplyrrolling-computation

解决方案


您可以取除第一列之外的所有列的逐行平均值,并将两个值的滚动平均值添加为新列。在基础 R 中,您可以执行以下操作:

val <- rowMeans(df[-1])
df$new_column <- c(NA, (head(val, -1) + tail(val, -1))/2)

如果你想使用dplyr你可以使用:

library(dplyr)

df %>%
  mutate(new_column = rowMeans(.[-1]), 
         new_column = (new_column + lag(new_column))/2)


#              exclude  mpg cyl  disp  hp drat   wt qsec vs am gear carb new_column
#1            Mazda RX4 21.0   6 160.0 110 3.90 2.62 16.5  0  1    4    4         NA
#2        Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.88 17.0  0  1    4    4       29.9
#3           Datsun 710 22.8   4 108.0  93 3.85 2.32 18.6  1  1    4    1       26.8
#4       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.21 19.4  1  0    3    1       31.2
#5    Hornet Sportabout 18.7   8 360.0 175 3.15 3.44 17.0  0  0    3    2       46.2
#6              Valiant 18.1   6 225.0 105 2.76 3.46 20.2  1  0    3    1       44.4
#7           Duster 360 14.3   8 360.0 245 3.21 3.57 15.8  0  0    3    4       47.4
#8            Merc 240D 24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2       42.2
#...
#...

如果您以长格式获取数据以获得回溯x天数的解决方案,则会更容易。

x <- 2
df %>% mutate(row = row_number()) -> df1

df1 %>%
  tidyr::pivot_longer(cols = -c(exclude, row)) %>%
  group_by(row) %>%
  summarise(val = mean(value)) %>%
  mutate(val = zoo::rollmeanr(val, x, fill = NA)) %>%
  left_join(df1, by = 'row')

推荐阅读