В R, как мне сопоставить числовые значения с факторами, включая Inf и NaN? - PullRequest
5 голосов
/ 29 августа 2011

Используя R, у меня есть вектор, такой как

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

Я хотел бы преобразовать его в что-то вроде

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

с минимально возможной болью.Как это сделать?

Спасибо!Uri

Ответы [ 4 ]

6 голосов
/ 29 августа 2011

ifelse(), кажется, работает достаточно хорошо:

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

Технически, это возвращает вектор символов, который можно преобразовать с помощью as.factor() или просто обернуть factor() вокруг начального вызова, чтобы вернуть коэффициент для начала ... хотя символ может соответствовать вашим потребностям в зависимости от того, что вам нужно делать.

2 голосов
/ 29 августа 2011

Вот вариант, в котором используются собственные имена R, за исключением «Finite», поэтому запись немного короче, а в качестве бонуса также обрабатывает отрицательную бесконечность и 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 s, просто не звоните format:

sub("Inf", "Infinity", ifelse(is.finite(a), "Finite", a))
#[1] "Finite"    "Finite"    "Finite"    "Infinity"  "-Infinity" "NaN"       NA   
2 голосов
/ 29 августа 2011

Вы также можете использовать 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"
0 голосов
/ 29 августа 2011

Другой метод может быть примерно таким (аналогично вопросу Запись числового вектора ):

type <- rep("Finite", length(a))
type[is.nan(a)] <- "NaN"
type[is.infinite(a)] <- "Infinite"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...