簡體   English   中英

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

[英]In R, how do I map numeric values to factors, including Inf and NaN?

使用R,我有一個矢量,如

a <- c(0.1,0.6,23,Inf,NaN)

我想把它轉換成類似的東西

c("Finite","Finite","Finite","Inf","NaN")

盡可能少的痛苦。 這是怎么做到的?

謝謝! 烏里

ifelse()似乎工作得相當好:

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

從技術上講,它返回一個字符向量,可以使用as.factor()進行轉換,或者只是在初始調用周圍包裝factor()以返回一個開始的因子...盡管字符可能適合您的需要,具體取決於您需要什么做。

你也可以使用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"

這是一個使用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   

另一種方法可以是這樣的(類似於重新編碼數字向量的問題):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM