2017-09-16 38 views
1

我有以下问题:转换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值也转换为“0”。

我该怎么做?

+0

难道你的意思是'一个[A> 10 is.nan(一)!< - 1; a [a <= 10&!is.nan(a)] < - 0' – akrun

+0

@akrun但是数据并不是绝对的。只要我'a [a> 10&!is.nan(a)] < - “1”'所有的NaN值都被转换为“1”或“0”。 – D1X

+0

或者只是'a [] < - as.numeric(a> 10)'会做到这一点('NaN'转换为'NA') –

回答

0

这里的交易...你的第一个操作的转换是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 
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