How to coerce a list object to type ‘double’

The code:

a <- structure(list(`X$Days` = c("10", "38", "66", "101", "129", "185", "283", 
                                 "374")), .Names = "X$Days")

Then a is like

$`X$Days`
[1] "10"  "38"  "66"  "101" "129" "185" "283" "374"

I would like to coerce a to an array of numeric values, but coercing functions return me

Error: (list) object cannot be coerced to type 'double'

Thanks,

5 Answers

If you want to convert all elements of a to a single numeric vector and length(a) is greater than 1 (OK, even if it is of length 1), you could unlist the object first and then convert.

as.numeric(unlist(a))
# [1]  10  38  66 101 129 185 283 374

Bear in mind that there aren’t any quality controls here. Also, X$Days a mighty odd name.

If your list as multiple elements that need to be converted to numeric, you can achieve this with lapply(a, as.numeric).

You can also use list subsetting to select the element you want to convert. It would be useful if your list had more than 1 element.

as.numeric(a[[1]])

In this case a loop will also do the job (and is usually sufficiently fast).

a <- array(0, dim=dim(X))
for (i in 1:ncol(X)) {a[,i] <- X[,i]}

There are problems with some data. Consider:

as.double(as.character("2.e")) # This results in 2

Another solution:

get_numbers <- function(X) {
    X[toupper(X) != tolower(X)] <- NA
    return(as.double(as.character(X)))
}

Leave a Reply

Your email address will not be published. Required fields are marked *