Conversia de la o listă la numere în R (Programare, R, Lista, Matrix, Numeric)

Edgardo Ortiz a intrebat.

Am avut recent o problemă în care, de fiecare dată când citeam un fișier csv care conținea un tabel cu valori, R îl citea în format listă în loc de format numeric. Deoarece niciun fir de discuție nu mi-a oferit răspunsul complet pentru situația mea, odată ce am reușit să o fac să funcționeze, am decis să includ aici scriptul care a funcționat pentru mine în speranța că este util cuiva. Iată-l aici, cu o descriere și câteva opțiuni în caz că aveți nevoie de el:

(1) Citiți datele dintr-un fișier csv. Aici fișierul nu are antet, așa că am pus F, dacă al tău are antet, atunci schimbă-l în T.

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

(1.a) Notă: Dacă primiți un avertisment care spune „incomplete final line found by readTableHeader”, înseamnă că R nu a găsit un simbol de sfârșit de fișier. Doar puneți o linie goală suplimentară la sfârșit în fișierul csv și mesajul nu va mai apărea.

(2) Puteți verifica dacă datele sunt în format listă (dacă sunt numerice, atunci sunteți gata și nu aveți nevoie deloc de această procedură!) cu ajutorul comenzii mode.

mode(data)

(3) Inițializați o matrice (ca NA) în care doriți ca datele să fie în format numeric, folosind dimensiunile datelor.

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

(4) OPȚIONAL: Dacă doriți să adăugați nume la coloane și/sau rânduri, puteți utiliza una dintre aceste opțiuni.

(4a) Adăugați nume coloanelor și rândurilor, presupunând că fiecare dintre ele are informații similare, cu alte cuvinte, doriți ca numele să fie col_1, col_2, … și row_1, row_2, …

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

(4b) Dacă doriți nume diferite pentru fiecare coloană și fiecare rând, utilizați în schimb această opțiune și adăugați toate numele manual.

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

(5) Transformați datele din formă de listă în formă numerică și introduceți-le în matricea dataNum.

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

(6) Puteți verifica dacă matricea este în format numeric cu ajutorul comenzii mode.

mode(dataNum)

(7) OPȚIONAL: În cazul în care doriți să transpuneți matricea, puteți utiliza următoarea instrucțiune.

dataNum <- t(dataNum)

Comentarii

  • Nu includeți răspunsul în întrebare. Scrieți-ne problema pe care ați dorit să o rezolvați ca întrebare și trimiteți un răspuns ca răspuns real… –  > Por Dason.
  • Cred că acest lucru este probabil mai potrivit pe blogul tău sau similar. După cum subliniază @Dason, acest lucru nu se potrivește cu stilul Q&A al acestui site. Verificați faq dacă sunteți pentru detalii dacă nu sunteți sigur cum să postați pe site. Efort bun totuși, are nevoie doar de un pic de editare pentru a o reorienta ca Q&A. –  > Por Simon O’Hanlon.
  • Funcționează și îmi place! Acest lucru tocmai mi-a rezolvat o mulțime de frustrări. Doar că mă întreb dacă doar folosind numele rândurilor și al coloanelor din df-ul meu original cu colnames(dataNum) <- colnames(originalDF) mă va băga în necazuri pentru că nu se potrivește. Dar până acum arată bine 🙂 –  > Por Sebastian Hesse.
1 răspunsuri
flodel

Iată o modalitate mai scurtă/mai rapidă de a transforma data.frame-ul tău într-o matrice numerică:

data <- data.matrix(data)

Există, de asemenea, și

data <- as.matrix(data)

dar o diferență importantă este dacă datele tale conțin o coloană de factori sau de caractere: as.matrix va constrânge totul într-o matrice de caractere, în timp ce data.matrix va returna întotdeauna o matrice numeric sau integer matrice.

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"

Comentarii

  • Niciuna dintre abordări (mesajele originale sau răspunsul de mai jos) nu funcționează pentru mine, așa că tot nu pot obține sumele de rânduri… –  > Por SiKiHe.
  • @SikiHe: nu este un comentariu foarte constructiv, poți să elaborezi? Poate creați propria întrebare cu un exemplu reproductibil și faceți un link către ea de aici… –  > Por flodel.
  • Am exact aceeași problemă ca cea de mai sus, de aceea am considerat că nu este necesar să-mi creez propriul post. Importez un fișier csv și încerc să obțin rowSums, dar primesc un mesaj de eroare care îmi spune că intrarea în rowSums trebuie să fie numerică. Am încercat ambele abordări descrise aici și niciuna dintre ele nu a funcționat. Adică, fie cifrele au fost convertite în ranguri și, prin urmare, rowSums erau incorecte, deoarece nu au fost adăugate cifrele inițiale, fie nu erau numerice și nu au putut fi adăugate în primul rând. –  > Por SiKiHe.
  • Vă rugăm să postați datele dumneavoastră. Trebuie să aveți undeva un element non-numeric care forțează R să trateze întreaga coloană (sau coloanele) ca factor. –  > Por flodel.