[R] Detecting numerical value in character variable

Mark Myatt mark at myatt.demon.co.uk
Thu Dec 6 12:18:47 CET 2001


Jameson C . Burt <jameson at monumental.com> writes:
>I have a variable that can have either numeric or character values.
>When numeric, I take one action; when not-numeric, I take another action.
>Unfortunately, my approaches are awkward, so I look for others' approaches.
>
>To detect a numeric value, I have semi-successfully used two appoaches.
>I somewhat simplify here using direct character values like "123" rather than a 
>variable.
>1. !is.na(as.numeric("123"))
>   which responds "TRUE", but
>      !is.na(as.numeric("abc"))
>   responds
>      FALSE    #so I know it is not numeric
>      Warning message:
>      NAs introduced by coercion
>   This all works well enough except the error message looks bad 
>   when printed, and hints that I use the wrong appoach.
>
>2. !as.logical(gsub("1","T",gsub("-1","F",as.character(regexpr("[^0-9]","123")))
>))
>   This responds "TRUE" for the string "123" having only numeric characters.
>   However, notice how harsh this is on the reader.
>   
>   Unfortunately, "regexpr" here responds in -1 and 1 rather than FALSE and 
>TRUE, 
>   so this becomes an extra verbose appoach.
>
>My question: CAN ONE BETTER DETECT NUMERIC DATA IN A CHARACTER VARIABLE?
>One first imagines trying,
>   is.numeric("123")
>but this responds FALSE, telling us merely that this is a character string.
>
>
>This problem arises in an R program I have used for years to balance my 
>checkbook,
>producing 5 lines identical to my bank's statement.
>I input my checkbook data from a file with one natural column having entries 
>like
>(excluding # comments),
>   3117             #check number
>   SALARY:10-1-01   #salary deposited on 10/1/2001
>   TRANSF:10-23-01  #transfer between accounts on 10/23/2001
>These non-numerical descriptive entries speed balancing my checkbook,
>especially when I error.

Your first solution is fine:

        a <- c("a", "b", 3, 4, "f")
        b <- as.numeric(a)
        a[!is.na(b)]


but gives warnings. Suppress them with options():

        a <- c("a", "b", 3, 4, "f")
        options(warn = -1)
        b <- as.numeric(a)
        a[!is.na(b)]
        
Remember to reinstate warnings:

        options(warn = 1)

When you are finished. See help(options).

Mark

--
Mark Myatt


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list