2014-03-25 7 views
1

Я написал функцию, которая преобразует значения Inf/NaN в R в NA. Функция выглядит следующим образом:Фактор и Inf/NaN

DSanity.replaceInfNan <- function(l) 
{ 
    l <- ifelse((is.infinite(l))|(is.nan(l)), NA, l); 
    return(l) 
} 

Однако, когда класс (л) является одним из факторов, эта функция возвращает объект класса целого числа. Любые решения для получения одного класса без явной проверки фактора класса? Ниже приведен пример.

dput(m)  
structure(c(2L, 2L, 3L, 4L, 5L, 6L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
    9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
    22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 2L, 2L, 3L, 4L, 5L, 6L, 
    7L, 8L, 9L, 10L, 11L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
    2L, 3L, 4L, 5L, 6L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
    12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
    25L, 26L, 27L, 2L, 3L, 4L, 2L, 3L, 4L, 2L, 3L, 4L, 5L, 6L, 7L, 
    8L, 9L), .Label = c("1984", "1985", "1986", "1987", "1988", "1989", 
    "1990", "1991", "1992", "1993", "1994", "1995", "1996", "1997", 
    "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005", 
    "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013" 
    ), class = "factor") 

class(DSanity.replaceInfNan(m)) 
"integer" 
+1

Если функция предназначена только для факторов, вы можете работать на уровнях/этикетках вместо этого. Если нет, то явная проверка кажется необходимой. Что в этом плохого? – tonytonov

ответ

3
DSanity.replaceInfNan <- function(l) { 
    l[is.infinite(l) | is.nan(l)] <- NA 
    return(l) 
} 
+0

не могли бы вы объяснить мне, почему одна функция возвращает целое число, а другая возвращает коэффициент, хотя обе функции кажутся эквивалентными? Благодарю. – Sumit

+2

На странице справки «ifelse» выдается предупреждение о том, что «Режим результата может зависеть от значения« test__ », который является первым параметром для вашего вызова ifelse. Несмотря на то, что третий параметр явно является фактором, первым не является, и именно это R использует для определения режима возврата –

+0

Спасибо за разъяснение. – Sumit

Смежные вопросы