将4-D数值数组转换为分类数组

时间:2017-09-16 16:54:09

标签: arrays r

我有以下问题:

我有一个4D数组,例如

a <- array(seq(1,2*3*4*2), c(2,3,4,2))
a[1,2,3,2] <- NaN

我需要使用特定阈值将此数组转换为分类数据。例如,它可能类似于a[ a > 10 ] <- "1"a[ a <= 10 ] <- "0"

现在的问题是NaN值也会转换为&#34; 0&#34;。

我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

这是交易......您的第一个操作会将NaN转换为不是NaN的“NaN”。由于您将数组更改为字符向量,因此数组底层的原子向量无法保持为真NaN

, , 3, 2

     [,1] [,2]  [,3]
[1,] "1"  "NaN" "1" 
[2,] "1"  "1"   "1" 

第二次比较和分配转换为

, , 3, 2

     [,1] [,2]  [,3]
[1,] "0"  "NaN" "0" 
[2,] "0"  "0"   "0"

所以我对你声称它被转换为“0”感到有点困惑。您可能仍然对其他值转换为零的问题感到困惑,但这可以通过此操作解释:

> "1" <= 10
[1] TRUE

这提供了我认为你想要的东西:

a[] <- ifelse( is.na(a), "NaN", 
                         ifelse(a >10 , "1", "0") )
#Check
table(a, useNA="always")
#----
a
   0    1  NaN <NA> 
  10   37    1    0 

答案 1 :(得分:0)

如果您准备使用整数10而不是字符"1""0",那么您需要做的就是

a[] <- as.numeric(a>10)

[]确保保留a的结构 - 否则它将成为矢量。 as.numeric只是将逻辑TRUE/FALSE转换为1/0NaN变为NA

然后你得到

a
, , 1, 1

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0

, , 2, 1

     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    0    0    1

, , 3, 1

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1

, , 4, 1

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1

, , 1, 2

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1

, , 2, 2

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1

, , 3, 2

     [,1] [,2] [,3]
[1,]    1   NA    1
[2,]    1    1    1

, , 4, 2

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1