使用R,我有一個載體,諸如在R中,如何將數值映射到因子,包括Inf和NaN?
a <- c(0.1,0.6,23,Inf,NaN)
我想它用盡可能少的痛苦儘可能轉化爲類似
c("Finite","Finite","Finite","Inf","NaN")
。這是如何完成的?
謝謝! 烏里
使用R,我有一個載體,諸如在R中,如何將數值映射到因子,包括Inf和NaN?
a <- c(0.1,0.6,23,Inf,NaN)
我想它用盡可能少的痛苦儘可能轉化爲類似
c("Finite","Finite","Finite","Inf","NaN")
。這是如何完成的?
謝謝! 烏里
另一種方法可以是這樣的(同樣質疑Recoding Numeric Vector):
type <- rep("Finite", length(a))
type[is.nan(a)] <- "NaN"
type[is.infinite(a)] <- "Infinite"
ifelse()
似乎運作得相當好:
b <- ifelse(is.finite(a), "Finite", ifelse(is.infinite(a), "Infinite", "NaN"))
> b
[1] "Finite" "Finite" "Finite" "Infinite" "NaN"
從技術上講,它返回一個特徵向量,它可以與as.factor()
轉換或只是包裝factor()
周圍的初始調用返回到開始的一個因素。雖然角色可能適合您的需求,這取決於您需要做什麼。
有一件事:在您的解決方案中,「NA」編碼爲「NaN」。 – Marek
您也可以使用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"
...但是,如果你真的想要字符串「無限」和「負無窮大」,那麼這將做到這一點:
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
在SO上回答自己的問題是一種很好的做法,但這是一個特別糟糕的答案,因爲您的解決方案引入了一些未出現在問題中的新變量。 – Andrie
@UriLaserson我清理了一下你的答案(包括Andrie的提示),如果你不喜歡它,隨時回滾。 – Marek