我正在尝试根据一列数据的移动平均值计算数值范围。我找到了一种使用/000comp1 /001comp2
来生成移动平均值列的方法,并且我知道如何在Excel中使用此方法来生成所需的列,但是我很想知道一种方法来完成所有这些操作在一个R脚本中。
这是我为R简化的可复制示例。
/comp001 /comp002
这个小标题看起来像这样:
caTools::runmean
要生成所需的剩余数据,我使用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"))
将其导出到Excel,最终表如下所示。 > 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,...)
(dbl_i
与下一个=B2-ABS(C3-B2)
之间的差值从mydbl
中减去以创建等距的下限)。 avg
中的最后一个值是公式mydbl
(dbl_f
与=B9+ABS(C9-B9)
中添加的mydbl
之间的差,以创建等距的上限)。两列中的其他值只是对avg
列的直接引用。
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
。最终,似乎真正的问题在于找到一种方法来重现Excel计算avg
和=B9+abs(C9=B9)
。
有人知道他们将如何在R中重现这些计算吗?我一直在寻找一种在R中创建公式的方法,该公式可能与D2=B2-ABS(C3-B2)
等效,但是除非我创建矩阵,否则找不到一个公式。我必须创建一个矩阵吗?
感谢您的时间。
答案 0 :(得分: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
,但我相信这是一样的效果。)