2016-09-20 26 views
1

我有一個簡單的問題,我似乎無法在google,stackoverflow或stackexchange上找到答案。我目前正在使用rollapply的示例來查找包含NA的某些值的總和。例如:rollapply na.rm = TRUE給0值而不是NA的

z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA)) 
rollapply(z, 3, sum, na.rm = TRUE, align = "right") 

此輸出:

3 4 5 6 7 8 9 
    0 0 2 5 9 12 9 

這看起來不錯,但是,也有地方有3 NA的連續兩次。總和功能將NA的值交換爲0。不幸的是,這與我將要使用的數據無關,因爲0是一個有意義的值。有沒有辦法用NA再次替換0?

我在尋找如下的輸出:

3 4 5 6 7 8 9 
    NA NA 2 5 9 12 9 

預先感謝您!

回答

0

你可以做以下的(儘管不是很漂亮)

require(zoo) 
z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA)) 
tmp <- rollapply(z, 3, sum, na.rm = TRUE, align = "right") 

tmp[is.na(z)[-2:-1] & tmp == 0] <- NA 
tmp 

所以你分配NA無論z爲Na且有由rollapply

,讓你產生了NA

> tmp 
3 4 5 6 7 8 9 
NA NA 2 5 9 12 9 
+0

'roll_sumr'仍然給我與'rollapply'相同的結果。我將你的代碼修改爲'roll_sumr(z,3,na.rm = TRUE)',但仍然給了我和前面類似的結果。我正在尋找的輸出是在主要問題中說明的。 – lurodrig

+0

「不太好」,但嘿,它完成了工作。謝謝! – lurodrig

0

這裏有兩種方法:

1)請注意,並不是rollapply正在給出0,而是sum(x, na.rm = TRUE)正在給出0.功能sum(x, na.rm = TRUE)實際上並不是這裏所期望的。

相反,提供一種版本的sum,在所需的方式工作,即,其返回NA當輸入是完全NA值,否則返回sum(x, na.rm = TRUE)

sum_na <- function(x) if (all(is.na(x))) NA else sum(x, na.rm = TRUE) 
rollapplyr(z, 3, sum_na) 

2)或者,用你的代碼,並通過更換其輸入的任何位置之後修復它是所有NANA

zz <- rollapplyr(z, 3, sum, na.rm = TRUE) 
zz[rollapply(is.na(z), 3, all)] <- NA 

,並提供:

> zz 
3 4 5 6 7 8 9 
NA NA 2 5 9 12 9 
相關問題