如何在R的列中引用“单元格”?

时间:2018-08-14 14:26:48

标签: r formula array-formulas r-table

我正在尝试根据一列数据的移动平均值计算数值范围。我找到了一种使用/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中的最后一个值是公式mydbldbl_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_iavg列与=B2-abs(C3-B2)列相同,只不过它上移了一个,最终值为dbl_f。最终,似乎真正的问题在于找到一种方法来重现Excel计算avg=B9+abs(C9=B9)

有人知道他们将如何在R中重现这些计算吗?我一直在寻找一种在R中创建公式的方法,该公式可能与D2=B2-ABS(C3-B2)等效,但是除非我创建矩阵,否则找不到一个公式。我必须创建一个矩阵吗?

感谢您的时间。

1 个答案:

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