web-dev-qa-db-fra.com

Conversion d'une liste en numérique dans R

J'ai récemment eu un problème dans lequel chaque fois que je lis un fichier csv contenant une table avec des valeurs, R le lisait sous forme de liste au lieu de numérique. Comme aucun thread ne m'a fourni la réponse complète à ma situation, une fois que j'ai pu le faire fonctionner, j'ai décidé d'inclure ici le script qui a fonctionné pour moi dans l'espoir qu'il soit utile à quelqu'un. Le voici, avec une description et des options au cas où vous en auriez besoin:

(1) Lisez les données d'un fichier csv. Ici, le fichier n'a pas d'en-tête, donc je mets F, si le vôtre a un en-tête, puis changez-le en T.

data <- read.csv("folder_path/data_file.csv", header=F)

(1.a) Remarque: Si vous obtenez un avertissement indiquant "ligne finale incomplète trouvée par readTableHeader", cela signifie que R n'a pas trouvé de symbole de fin de fichier. Mettez simplement une ligne vide supplémentaire à la fin dans le fichier csv et le message n'apparaîtra plus.

(2) Vous pouvez vérifier que les données sont au format liste (si elles sont numériques, alors vous êtes toutes définies et n'avez pas du tout besoin de cette procédure!) Avec la commande mode.

mode(data)

(3) Initialisez une matrice (comme NA) où vous voulez les données au format numérique, en utilisant les dimensions des données.

dataNum <- matrix(data = NA, nrow = dim(data)[1], ncol = dim(data)[2])

(4) FACULTATIF: Si vous souhaitez ajouter des noms à vos colonnes et/ou lignes, vous pouvez en utiliser un si ces options.

(4a) Ajoutez des noms aux colonnes et aux lignes, en supposant que chacune a des informations similaires, en d'autres termes, vous voulez que les noms soient col_1, col_2, ... et row_1, row_2, ...

colnames(dataNum) <- colnames(dataNum, do.NULL = F, prefix = "col_")
rownames(dataNum) <- rownames(dataNum, do.NULL = F, prefix = "row_")

(4b) Si vous voulez des noms différents pour chaque colonne et chaque ligne, utilisez plutôt cette option et ajoutez tous les noms à la main.

colnames(dataNum) <- c("col_name_1", "col_name_2")
rownames(dataNum) <- c("row_name_1", "row_name_2")

(5) Transformez les données de la liste en forme numérique et placez-les dans la matrice dataNum.

for (i in 1:dim(data)[2]) {
    dataNum[,i] <- c(as.numeric(data[[i]]))
}

(6) Vous pouvez vérifier que la matrice est au format numérique avec la commande mode.

mode(dataNum)

(7) FACULTATIF: Si vous souhaitez transposer la matrice, vous pouvez utiliser l'instruction suivante.

dataNum <- t(dataNum)
14
Edgardo Ortiz

Voici un moyen plus court/plus rapide de transformer votre data.frame en une matrice numérique:

data <- data.matrix(data)

Il y a aussi

data <- as.matrix(data)

mais une différence importante est que si vos données contiennent une colonne de facteur ou de caractère: as.matrix contraindra tout dans une matrice de caractères tandis que data.matrix renverra toujours une matrice numeric ou integer.

data <- data.frame(
  logical   = as.logical(c(TRUE, FALSE)),
  integer   = as.integer(c(TRUE, FALSE)),
  numeric   = as.numeric(c(TRUE, FALSE)),
  factor    = as.character(c(TRUE, FALSE))
)

data.matrix(data)
#      logical integer numeric factor
# [1,]       1       1       1      2
# [2,]       0       0       0      1

as.matrix(data)
#      logical integer numeric factor 
# [1,] " TRUE" "1"     "1"     "TRUE" 
# [2,] "FALSE" "0"     "0"     "FALSE"
21
flodel