从先前12个单元的平均值中减去所选单元格值

时间:2016-10-05 22:45:06

标签: r

我有一个1565行和132列的矩阵(df)。我需要在df中找到一个单元格,其值等于1。然后从所选单元格中减去同一行中的“前12个单元格的平均值”。这12个观察值也可能包括NA值。输出矩阵(df1)基于NA,但应用公式的单元格除外。公式是:

df[ selected value "1"] - df [average of preceding 12 cells' values]

参见示例:

df
 4    5    6    2    7    2    0    8    3    0    2    4    1
NA    4    2    0    3    1    3    4    3    6    5    0    0
2    NA    3    2    5    7    0    NA    0    2    0    3    1

df1:
NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA   -2.58
NA    NA    NA    NA    NA  -1.25    NA    NA    NA    NA    NA    NA    NA
NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    -1.4

我们非常感谢您的帮助。

萨巴

1 个答案:

答案 0 :(得分:1)

让我们调用输入m,因为名称df表明它是数据框,而问题表明它是一个矩阵。我们最后在说明中对其进行了重复定义。

问题似乎是输出与输入相同尺寸的矩阵,使得对于每个输入元素等于1,将其替换为1减去前12个元素的平均值(如果小于12,则小于12)其中有12个可用)。当计算平均值时,不包括NA元素。对于不等于1的输入元素,将相应的输出元素设置为NA。

这可以通过在zoo包中使用rollapplyr的以下函数来完成。由于它按列工作,我们转置输入然后转换输出。 。

library(zoo)

one.minus.avg <- function(x) { 
  n <- length(x)
  if (identical(x[n], 1)) 1 - mean(x[-n], na.rm = TRUE) else NA
}

t(rollapplyr(t(m), 13, one.minus.avg, partial = TRUE))

,并提供:

     [,1] [,2] [,3] [,4] [,5]  [,6] [,7] [,8] [,9] [,10] [,11] [,12]     [,13]
[1,]   NA   NA   NA   NA   NA    NA   NA   NA   NA    NA    NA    NA -2.583333
[2,]   NA   NA   NA   NA   NA -1.25   NA   NA   NA    NA    NA    NA        NA
[3,]   NA   NA   NA   NA   NA    NA   NA   NA   NA    NA    NA    NA -1.400000

注意:我们将此用于输入m

m <- matrix(c(4, NA, 2, 5, 4, NA, 6, 2, 3, 2, 0, 2, 7, 3, 5, 2, 
     1, 7, 0, 3, 0, 8, 4, NA, 3, 3, 0, 0, 6, 2, 2, 5, 0, 4, 0, 3, 
     1, 0, 1), 3)