0

我正在尝试根据一列数据的移动平均值计算数值范围。我找到了一种用于caTools::runmean生成移动平均线列的方法,并且我知道如何在 Excel 中使用它来生成我想要的列,但我很想知道一种在一个 R 脚本中完成所有这些操作的方法。

这是我对 R 的简化可重现示例。

library(tidyverse)
library(caTools)
data <- as_tibble(data.frame(
  Index = as.integer(c(18,19,21,22,23,25,26,29)),
  mydbl = c(8.905,13.31,15.739,17.544,19.054,20.393,21.623,22.764)))

data <- data %>% 
  mutate(avg = runmean(mydbl,
                       k = 2,
                       alg = "exact",
                       endrule = "NA"))

这个小标题看起来像这样:

> data
# A tibble: 8 x 3
  Index mydbl   avg
  <int> <dbl> <dbl>
1    18  8.90  NA  
2    19 13.3   11.1
3    21 15.7   14.5
4    22 17.5   16.6
5    23 19.1   18.3
6    25 20.4   19.7
7    26 21.6   21.0
8    29 22.8   22.2

为了生成我想要的剩余数据,我将其导出到 Excel 中write_csv(data,...),最终表格如下所示。中的第一个值dbl_i是公式=B2-ABS(C3-B2)mydbl与下一个之间的avg差值减去mydbl以创建等距下限)。中的最后一个值dbl_f是公式=B9+ABS(C9-B9)(之间的差mydblavgmydbl加以创建等距上限)。两列中的其他值只是对该列的直接引用avg

Index   mydbl   avg     dbl_i   dbl_f
18      8.905   NA      6.7025  11.1075
19      13.31   11.1075 11.1075 14.5245
21      15.739  14.5245 14.5245 16.6415
22      17.544  16.6415 16.6415 18.299
23      19.054  18.299  18.299  19.7235
25      20.393  19.7235 19.7235 21.008
26      21.623  21.008  21.008  22.1935
29      22.764  22.1935 22.1935 23.3345

是的,这dbl_i只是avg列,但第一个值为=B2-abs(C3-B2). 并且该dbl_f列与该列相同,avg只是它向上移动了一个,最终值为=B9+abs(C9=B9). 最终,真正的问题似乎在于找到一种方法来重现 Excel 计算D2=B2-ABS(C3-B2)E9=B9+ABS(C9-B9).

有谁知道他们将如何在 R 中重现这些计算?我正在寻找一种在 R 中创建一个公式的方法,它可能相当于B2-ABS(C3-B2),但找不到,除非我创建一个矩阵。我必须创建一个矩阵吗?

谢谢你的时间。

4

1 回答 1

1
data %>% 
  mutate(
    avg = zoo::rollmean(mydbl, 2, align="right", fill=NA),
    dbl_i = if_else(row_number() == 1L, mydbl - abs(lead(avg) - mydbl), avg),
    dbl_f = if_else(row_number() == n(), mydbl + abs(avg - mydbl), lead(avg))
  )
# # A tibble: 8 x 5
#   Index mydbl   avg dbl_i dbl_f
#   <int> <dbl> <dbl> <dbl> <dbl>
# 1    18  8.90  NA    6.70  11.1
# 2    19 13.3   11.1 11.1   14.5
# 3    21 15.7   14.5 14.5   16.6
# 4    22 17.5   16.6 16.6   18.3
# 5    23 19.1   18.3 18.3   19.7
# 6    25 20.4   19.7 19.7   21.0
# 7    26 21.6   21.0 21.0   22.2
# 8    29 22.8   22.2 22.2   23.3

老实说,它不是最优雅的,但它可以完成工作。

(顺便说一句:我正在使用zoo::rollmean是因为我没有caTools安装,但我相信它的效果是一样的。)

于 2018-08-14T14:48:35.203 回答