2013-07-06 6 views
11

Recentemente ho avuto un problema in cui ogni volta che leggo un file CSV contenente una tabella con valori, R lo legge come un formato elenco invece che numerico. Poiché nessun thread mi ha fornito l'intera risposta alla mia situazione, una volta che sono riuscito a farlo funzionare ho deciso di includere qui la sceneggiatura che ha funzionato per me nella speranza che sia utile a qualcuno. Eccolo, con qualche descrizione e alcune opzioni nel caso ne abbiate bisogno:Conversione da un elenco a numerico in R

(1) Leggere i dati da un file csv. Ecco il file non ha intestazione, così ho messo F, se il vostro hanno un colpo di testa, poi modificarlo a T.

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

(1.a) Nota: Se si riceve un messaggio di avviso che dice "riga finale incompleta trovato di readTableHeader ", ciò significa che R non ha trovato un simbolo di fine file. Basta inserire una riga in più alla fine nel file csv e il messaggio non verrà più visualizzato.

(2) È possibile verificare che i dati siano in formato elenco (se è numerico, quindi sono tutti impostati e non è necessaria questa procedura affatto!) Con il comando modalità.

mode(data) 

(3) Inizializza una matrice (come NA) dove si desidera che i dati in formato numerico, utilizzando le dimensioni dei dati.

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

(4) Facoltativo: se si desidera aggiungere i nomi alle vostre colonne e/o righe, si potrebbe usare uno se queste opzioni.

(4a) Aggiungere i nomi alle colonne e righe, partendo dal presupposto che ogni hanno informazioni simili, in altre parole, si desidera che i nomi da col_1, col_2, ... e row_1, row_2, ...

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

(4b) Se vuoi nomi diversi per ogni colonna e ogni riga, usa invece questa opzione e aggiungi tutti i nomi a mano.

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

(5) Trasforma i dati dall'elenco al modulo numerico e li inserisce nei dati della matriceNum.

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

(6) È possibile verificare che la matrice sia in formato numerico con il comando di modalità.

mode(dataNum) 

(7) OPTIONAL: Nel caso in cui si desidera trasporre la matrice, è possibile utilizzare le seguenti istruzioni.

dataNum <- t(dataNum) 
+6

Non includere la risposta nella domanda.Scrivi il problema che volevi risolvere come domanda e invia una risposta come risposta reale ... – Dason

+1

Penso che questo sia probabilmente più appropriato sul tuo blog o simile. Come sottolinea @Dason, questo non si adatta perfettamente allo stile di domande e risposte di questo sito web. Controlla il [** faq **] (http://stackoverflow.com/faq) se sei per i dettagli se non sei sicuro di come pubblicare sul sito. Un buon sforzo, però, richiede solo un piccolo editing per ridefinirlo come un Q & A. –

risposta

19

Ecco un/via più breve più veloce per trasformare il tuo data.frame in una matrice numerica:

data <- data.matrix(data) 

C'è anche

data <- as.matrix(data) 

ma una differenza importante è se i dati contiene una colonna fattore o carattere: as.matrix costringerà tutto in una matrice di caratteri mentre data.matrix restituirà sempre un numeric oMatrice.

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" 
+2

Nessun approccio (post originale o risposta sotto) funziona per me, quindi non riesco ancora a ottenere i rowSum ... – SiKiHe

+0

@SikiHe: non è un commento molto costruttivo, puoi elaborare? Forse crei la tua domanda con un esempio riproducibile e linkalo da qui ... – flodel

+0

Ho esattamente lo stesso problema di cui sopra, ed è per questo che ho pensato che non fosse necessario creare il mio post. Sto importando un file csv e sto cercando di ottenere le rowSum, ma ricevo un messaggio di errore che l'input di rowSums deve essere numerico. Ho provato entrambi gli approcci descritti qui e nessuno dei due ha funzionato. Cioè, o le figure sono state convertite in ranghi e quindi i rowSum non erano corretti perché non erano le cifre originali che sono state aggiunte, o non erano numeriche e non potevano essere aggiunte in primo luogo. – SiKiHe