web-dev-qa-db-fra.com

Comment contraindre un objet de la liste à taper 'double'

Le code:

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

Alors a est comme

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

J'aimerais forcer a à un tableau de valeurs numériques, mais les fonctions de contrainte me renvoient

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

Merci,

58
Lisa Ann

Si vous souhaitez convertir tous les éléments de a en un seul vecteur numérique et que length(a) est supérieur à 1 (OK, même s'il est de longueur 1), vous pouvez tout d'abord unlist puis convertir.

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

Gardez à l'esprit qu'il n'y a pas de contrôle de qualité ici. En outre, X$Days un nom étrange et puissant.

106
BenBarnes

Si votre liste contient plusieurs éléments à convertir en éléments numériques, vous pouvez y parvenir avec lapply(a, as.numeric).

23
Matthew Plourde

Il y a des problèmes avec certaines données. Considérer:

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

Une autre solution:

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

Dans ce cas, une boucle fera également l'affaire (et est généralement suffisamment rapide) .

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