我有以下问题:
我有一个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;。
我怎么能这样做?
答案 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)
如果您准备使用整数1
和0
而不是字符"1"
和"0"
,那么您需要做的就是
a[] <- as.numeric(a>10)
[]
确保保留a
的结构 - 否则它将成为矢量。 as.numeric
只是将逻辑TRUE/FALSE
转换为1/0
。 NaN
变为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