2016-10-05 41 views
-1

我有一個1565行和132列的矩陣(df)。我需要在df中找到一個值等於1的單元格。然後從所選單元中減去同一行中的「前12個單元的平均值」。這12個觀察值也可以包括NA值。除應用公式的單元外,輸出矩陣(df1)基於NA。其計算公式爲:從前12個單元格的平均值中減去選定單元格的值

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

這類問題需要有一個自包含最小的可重複的例子,包括所有輸入和你最好的代碼嘗試。見[mcve] –

+0

我提供了樣品@ G.Grothendieck。你能幫我找到這個問題的代碼嗎? – Saba

+1

未來,請通過顯示生成輸入的R代碼來重複提供輸入,以允許其他人將其複製並粘貼到他們的會話中以獲取輸入我在回答結束時的註釋中爲您完成了這一操作。 –

回答

1

讓我們把輸入m起名字df表明,它是數據幀,而問題表示它是一個矩陣。我們已經在最後的說明中重複地定義了它。

問題似乎是輸出一個與輸入尺寸相同的矩陣,使得對於等於1的每個輸入元素,用1減去前面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) 
相關問題