r - 使用 dplyr::mutate() 获取选定列的滚动平均值
问题描述
我想使用 dplyr 在新列中的每最后 2 行中获取滚动方式。让我们以 mtcars 作为示例数据。我会将行名转换为新列,以更好地表示我的真实数据集(第一列中有日期)
df = tibble::rownames_to_column(mtcars, "exclude")
现在我想要一个新列,它给出每最后两行的滚动平均值(假设现在包含汽车名称的“排除”列实际上包含日期)。应该是输出:
我试图用 dplyr::mutate() 和 cross() 来做到这一点,但我没有设法这样做。
更重要的是,有时我可能不得不为之前的许多行计算这些滚动行均值,比如 13 行左右。
谢谢和最美好的祝愿!
解决方案
您可以取除第一列之外的所有列的逐行平均值,并将两个值的滚动平均值添加为新列。在基础 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')
推荐阅读
- python - PhraseMatcher 不匹配 LEMMA
- javascript - 无法在精确坐标处附加可拖动元素
- gitlab-ci - Gitlab-CI 管道对另一个 git repo 发出合并请求
- reporting-services - 如何在 SSRS 中的整个文档中添加标尺
- css - Webpack:没有加载器来处理 SCSS 是输入存在
- javascript - 无法在 Formik onSubmit 中设置错误
- apache - 无法将动态网址转换为静态网址
- postgresql - PostgreSQL - 用于全文生成列的更改列
- python - send_keys 不适用于 Google 航班上的 Selenium Python
- django - 基于请求的序列化器字段值