2015-09-30 15 views
1

我有一個數組,其中包含一些實際上應該爲'0'的NAs。在數組中,將行中的NAs部分數據設置爲0

  • 我認爲數據作爲 '行',例如[1,...,1]是一排,[1,,2]是另一種,[2,1]
  • 一些此類[一個,, b]組合應該包含所有的NAs,並應保持原樣。
  • 某些'行'至少包含一個非缺失值。在這種情況下,該行中的所有NA應該設置爲零。

例子:

x <- c(rep(NA,14),rep(NA,4),20,30,40,rep(NA,6),10, 
     rep(NA,7),rep(NA,4),20,30,40,rep(NA,6),10,rep(NA,7)) 
a1 <- array(x,dim=c(2,7,4)) 
a1[1,,] 
[,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] NA NA NA NA 
[3,] NA 20 NA NA 
[4,] NA 40 NA 10 
[5,] NA NA NA NA 
[6,] NA NA NA NA 
[7,] NA NA 30 NA 

應該是這樣的

a1[1,,] 
[,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] NA NA NA NA 
[3,] 0 20 0 0 
[4,] 0 40 0 10 
[5,] NA NA NA NA 
[6,] NA NA NA NA 
[7,] 0 0 30 0 

我已經使用函數嘗試和應用(),但沒有取得任何

set0 <- function(x) { if (sum(is.na(x)) < length(x)) { x[is.na(x)] <- 0 } } 

回答

3

你可以這樣做:

for (i in seq(dim(a1)[1])){ 
    a1[i,,][array(!!rowSums(!is.na(a1[i,,])), dim(a1[i,,])) & is.na(a1[i,,])] <- 0 
} 

#> a1[1,,] 
#  [,1] [,2] [,3] [,4] 
#[1,] NA NA NA NA 
#[2,] NA NA NA NA 
#[3,] 0 20 0 0 
#[4,] 0 40 0 10 
#[5,] NA NA NA NA 
#[6,] NA NA NA NA 
#[7,] 0 0 30 0 
#> a1[2,,] 
#  [,1] [,2] [,3] [,4] 
#[1,] NA NA NA NA 
#[2,] NA NA NA NA 
#[3,] 0 30 0 0 
#[4,] NA NA NA NA 
#[5,] NA NA NA NA 
#[6,] 0 0 20 0 
#[7,] 0 10 40 0 

說明:

基本上array(!!rowSums(!is.na(a1[i,,])), dim(a1[i,,]))是一個布爾矩陣,其中用數值線具有所有TRUE元素。如果你操作這是我們第一次穿透環(i=1,所以對於a1[1,,]),我們得到:

#> array(!!rowSums(!is.na(a1[1,,])), dim(a1[1,,])) 
#  [,1] [,2] [,3] [,4] 
#[1,] FALSE FALSE FALSE FALSE 
#[2,] FALSE FALSE FALSE FALSE 
#[3,] TRUE TRUE TRUE TRUE 
#[4,] TRUE TRUE TRUE TRUE 
#[5,] FALSE FALSE FALSE FALSE 
#[6,] FALSE FALSE FALSE FALSE 
#[7,] TRUE TRUE TRUE TRUE 

布爾矩陣array(!!rowSums(!is.na(a1[i,,])), dim(a1[i,,])) & is.na(a1[i,,])需要 - 你想要的 - 只TRUENA值的值在一排一些NUMERICS。

+0

工程很好,非常感謝! – Marianne

+0

不用擔心!不是那麼容易的數組問題,我會推薦R中更友好的其他結構......但也許你絕對需要數組! –

+0

這種情況下的數組在理解數據方面有很大的優勢,這些數據是每個受訪者的矩陣。 – Marianne