如何在 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)
(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
列与 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
,但我相信效果是一样的。)
我正在尝试根据一列数据的移动平均值计算数值范围。我找到了一种使用 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)
(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
列与 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
,但我相信效果是一样的。)