2011-08-29 14 views

回答

0

另一種方法可以是這樣的(同樣質疑Recoding Numeric Vector):

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

在SO上回答自己的問題是一種很好的做法,但這是一個特別糟糕的答案,因爲您的解決方案引入了一些未出現在問題中的新變量。 – Andrie

+0

@UriLaserson我清理了一下你的答案(包括Andrie的提示),如果你不喜歡它,隨時回滾。 – Marek

6

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

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

從技術上講,它返回一個特徵向量,它可以與as.factor()轉換或只是包裝factor()周圍的初始調用返回到開始的一個因素。雖然角色可能適合您的需求,這取決於您需要做什麼。

+0

有一件事:在您的解決方案中,「NA」編碼爲「NaN」。 – Marek

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

這裏的一個使用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" 

...但是,如果你真的想要字符串「無限」和「負無窮大」,那麼這將做到這一點:

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

最後,如果你想保持NA s,則只需請不要撥打format

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

某些變體可能是將NA轉換爲NA(而不是NA)字符串的ifelse(有限的,as.character(a))。 – Marek

+0

@Marek - 是的,我知道,但我認爲我已經有太多的變體:)雖然最後一個映射Inf到Infinity作爲OP請求。 – Tommy