在R中,如何将数值映射到因子,包括Inf和NaN?

时间:2011-08-29 02:32:36

标签: r

使用R,我有一个像

这样的向量
a <- c(0.1,0.6,23,Inf,NaN)

我想将其转换为类似

的内容
c("Finite","Finite","Finite","Inf","NaN")
尽可能少的痛苦。这是怎么做到的?

谢谢! URI

4 个答案:

答案 0 :(得分:6)

ifelse()似乎运作得相当好:

b <- ifelse(is.finite(a), "Finite", ifelse(is.infinite(a), "Infinite", "NaN"))
> b
[1] "Finite"   "Finite"   "Finite"   "Infinite" "NaN" 

从技术上讲,它会返回一个字符向量,可以使用as.factor()进行转换,或者只是在初始调用周围包裹factor()以返回一个以...开头的因子...尽管字符可能符合您的需求你需要做什么。

答案 1 :(得分:2)

你也可以使用match(不要忘记NA):

f <- function(x) {
    codes <- c("NaN", "Inf", "Inf", "NA", "Finite")
    codes[match(x, c(NaN, Inf, -Inf, NA), nomatch=5L)]
}

f(a)
# [1] "Finite" "Finite" "Finite" "Inf"    "NaN"

f(c(7.777, -Inf, NA, Inf, NaN, 0/0))
# [1] "Finite" "Inf"    "NA"     "Inf"    "NaN"    "NaN"

答案 2 :(得分:2)

这是一个使用R自己的名字的变体,除了“有限” - 所以它写得有点短,奖励也可以处理负无穷大和NA

# Include -Inf and NA...
a <- c(0.1,0.6,23,Inf,-Inf,NaN,NA)

format(ifelse(is.finite(a), "Finite", a), justify="none")
#[1] "Finite" "Finite" "Finite" "Inf"    "-Inf"   "NaN"    "NA"  

...但如果你真的想要字符串“Infinity”和“-Infinity”,那么这样就可以了:

sub("Inf", "Infinity", format(ifelse(is.finite(a), "Finite", a), justify="none"))

最后,如果您想保留NA,请不要拨打format

sub("Inf", "Infinity", ifelse(is.finite(a), "Finite", a))
#[1] "Finite"    "Finite"    "Finite"    "Infinity"  "-Infinity" "NaN"       NA   

答案 3 :(得分:0)

另一种方法可能是这样的(类似于问题Recoding Numeric Vector):

type <- rep("Finite", length(a))
type[is.nan(a)] <- "NaN"
type[is.infinite(a)] <- "Infinite"