我有一个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
我们非常感谢您的帮助。
萨巴
答案 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)