如何在 R 的列中引用 "cells"?

How to reference "cells" within a column in R?

我正在尝试根据一列数据的移动平均值计算数值范围。我找到了一种使用 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

为了生成我想要的剩余数据,我用 write_csv(data,...) 将其导出到 Excel,最终的 table 如下所示。 dbl_i 中的第一个值是公式 =B2-ABS(C3-B2)mydbl 与下一个 avg 之间的差值从 mydbl 中减去以创建等距下限)。 dbl_f 中的最后一个值是公式 =B9+ABS(C9-B9)mydblavg 之间的差值添加到 mydbl 以创建等距上限)。两列中的其他值只是对 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),但找不到,除非我创建一个矩阵。我必须创建一个矩阵吗?

感谢您的宝贵时间。

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,但我相信效果是一样的。)