De la spss la r

Când am început să folosesc R., trebuia să cunosc răspunsurile la acele întrebări care nu mai erau pentru mine înainte, de exemplu:

Sună familiar? Cred că da. Bine. să luăm în considerare totul cu atenție și în ordine.

În primul rând, tranziția la R este o schimbare a percepției. Pentru a vedea datele sunt ca o dependenta de droguri, de care trebuie sa scapi de: nu trebuie sa le vezi. Și tu chiar nu le vezi, pentru că ceea ce oferă SPSS este doar o mică bucată dreptunghiulară dintr-o gamă largă. Acest truc vizual mic pe care îl puteți implementa în R folosind comenzi simple.

Avem nevoie de o matrice experimentală de date; să spunem asta:

Copiați-l și lipiți-l în R:

Alt mod: puteți selecta să copiați conținutul tabelului în clipboard și să tastați următoarea comandă:

În ambele cazuri ar trebui să arate astfel:

Desigur, putem vedea (și edita) datele într-un mod familiar, folosind comanda fix (test) (dar nu am făcut acest lucru de când am trecut la R).

Ei bine, iată câteva comenzi SPSS pe care le-ați putea găsi interesante în R.

Vrem să sortăm datele noastre în ordine crescătoare în variabila ONE:

Cheia pentru a înțelege această comandă (sună ca o introducere la R, dar cu privire la fundamentale este mai bine să citiți manualul "Introducere în R") se află în modul în care R indexează rânduri și coloane. Există două instrumente cheie care fac această sortare:

  • funcția order (). consultați ajutorul folosind comanda? order;
  • conținutul cuprins în paranteze pătrate.

Parantezele pătrate conțin informații pentru indexare: înainte ca virgula să fie indexată pentru linii, după virgulă - pentru coloane. Funcția plasată în fața virgulei indică ce ne dorim să facem cu rândurile matricei noastre (și acesta este exact ceea ce dorim să facem: sortați observațiile, adică rândurile).

S-ar putea să doriți să sortați datele în ordine descrescătoare:

Există, de asemenea, o funcție sort (). dar este necesar să înțelegem că, în ciuda asemănării aparente a sarcinilor efectuate (sortarea elementelor, aceste funcții acționează diferit. Să luăm de exemplu vectorul simbolurilor:

Aha! Vectorul nostru este sortat. Dar care sunt diferențele cu funcția order ()?

order () returnează vectorul index. Ultimul caracter din vectorul nostru este "a" (a cincea poziție), care este în vectorul returnat de funcția order (). se află pe a cincea poziție (numărul 5 se întoarce mai întâi). Și așa mai departe:

Acum, diferența este clară: funcția sort () utilizează indicele returnate de funcția order ().

Sortarea observațiilor matricei de date are legătură cu indexarea; deci folosim funcția order () pentru acest scop. Se pare oarecum inconsistentă cu bunul simț să nu folosești sort () pentru a sorta rândurile, dar odată ce te obișnuiești cu asta, vei simți imediat că e natural.

Este foarte simplu: putem indexa matricea de date folosind "[. ] ».

La fel ca la sortare, vom scrie ceva în fața virgulei, pe măsură ce facem o operațiune pe linie.

Selectați toate observațiile unde ONE este 1:

Selectați toate observațiile unde ONE este 1 și DOUĂ este "a":

Selectați toate observațiile în care variabila ONE este 2 și variabila AGE este mai mică de 60:

Desigur, dacă folosim funcția attach (). atunci sintaxa va fi chiar mai simplă:

Prima diferență izbitoare în R este aceea că factorii nu sunt afișați ca numere. Să luăm ca exemplu o variabilă TWO din matricea noastră:

Opa! Acum, dacă cineva mă gândește cel puțin la extragerea valorii medii a unei astfel de variabile:

"Argumentul nu este numeric sau logic." Punct.

S-ar putea să credeți că utilizarea etichetelor în loc de numere este proastă (deși, de asemenea, am crezut). De ce ar vrea cineva să facă asta? Când introducem datele, folosim numere, nu litere. Deci, ce captură? Faptul este că ceea ce vedeți pe ecran nu este deloc ceea ce este stocat în baza de date. Magazinul (dacă nu mă înșel) este format din numere, R imprimă numai nivelele implicite pe ecran.

Să încercăm acest lucru:

Deci bărbații sunt 1, femeile 2.

Acordați atenție semnelor "mai puțin" ("<") между уровнями: их наличие говорит нам о том, что переменная является порядковой.

Acum, permiteți să atribuiți etichetele de valoare variabilă utilizând oricare dintre următoarele metode:

> nivele (încercați $ ONE) <- c("Low", "Medium", "High")

Sau, dacă preferați în mod explicit să indicați corespondența unui anumit număr la un nivel:

Acest lucru este chiar mai simplu decât etichetele de valoare. Știu două căi.

Prima modalitate este să atribuiți o etichetă prin intermediul funcției attr ().

Tocmai am atribuit variabilei TWO un atribut suplimentar numit "label" (numele nu contează și ar putea fi diferit, de exemplu "varlab"). Acum, să analizăm eticheta pentru variabila TWO:

A doua modalitate este de a folosi funcția label () din pachetul Hmisc.

Această funcție face același lucru, numai într-un mod mai intuitiv. Din nou, cereți eticheta:

Este greu de argumentat aici, dar această sarcină poate necesita mai mult efort de la tine decât vă puteți imagina. Dar, din moment ce ați pus deja piciorul pe drumul R și open source, de ce nu mergeți până la capăt?

Există două întrebări despre tabelele pe care trebuie să vă conving:

  • cum ar trebui arata masa?
  • cât de ușor este să inserați un tabel într-un document?

Acest lucru poate părea neconvingător, dar. Nu aveți nevoie de tabele cu formatare în stilul SPSS. Problema este într-adevăr: tabelele SPSS sunt prea "formatate". Prea multe selecții, prea multe linii, prea multe dreptunghiuri. Toate acestea sunt atât de atractive, încât distrage atenția de la principalul lucru din tabel - numerele din el.

Permiteți-mi să vă întreb o singură întrebare: cât de mult ați întâlnit publicații cu tabele formatate în stilul SPSS? Voi încerca să ghicesc și să spun: nu unul. Jurnalele profesionale utilizează formatări foarte simple pentru mese, doar câteva rânduri pentru a separa conținutul important. Astfel de tabele pot fi create folosind software special, de exemplu LaTeX.

Mai jos este o tabelă de frecvențe creată în SPSS pentru variabila ONE din matricea noastră.

Același lucru în R:

Anumite informații, fără linii. Avem nevoie de un total sau de împărțire? Este simplu:

Funcția table () este foarte puternică. Aruncați o privire și aflați cum funcționează. Chiar ai nevoie de ea.

Există multe modalități de a introduce o masă în text. Depinde de ce software folosiți:

  • Pentru LaTeX, aș folosi din nou pachetul Hmisc. Acesta include o funcție specială pentru crearea tabelelor LaTeX (este posibil să fiți interesat de funcția Sweave ())
  • Pentru OpenOffice.org există un alt pachet numit odfWeave. care îndeplinește aceeași sarcină ca Sweave (). dar în documentul OpenOffice. Nici măcar nu trebuie să copiați și să lipiți tabele sau diagrame: scrieți doar codul R în documentul dvs., treceți prin R (da, R o puteți face) și pe ieșire veți primi un nou document ODF cu tabele și diagrame în acele locuri , unde ați scris codul.

Ei bine, dacă vreau dintr-o dată să creez o copie exactă a tabelului SPSS în LaTeX, voi crea un obiect matrice (spune-l ONE), după cum urmează:

Și acum generați codul LaTeX după cum urmează:

Lansați codul rezultat în LaTeX și obțineți tabelul:

Adevărat, nu-i așa? Acesta este tipul de tabel pe care suntem obișnuiți să-l vedem în revistele profesionale.

Dacă aveți nevoie de mai multe argumente, următorul fapt vă va convinge cu siguranță: în SPSS există un lucru pe care îl puteți face cu masa - este inserat într-un document text. Ca o imagine frumoasă. În R, fiecare tabel poate fi definit ca un obiect separat, din care puteți extrage orice informație. Aveți acces dinamic la oricare număr din interior în orice moment. Ei bine, cum?

Aceasta este aceeași cu crearea unei singure variabile bazate pe valorile unei alte variabile; iar conversia la aceeași variabilă este de asemenea simplă.

La o altă variabilă Editați

Utilizând Editarea indexării

Ordinea nivelelor este luată din ordinea în care le-am indicat (nivelul "Tânăr" va fi primul).

Acum folosim doar puterea indexării, așezată în R.

Utilizând funcția cut ()

Există mai multe modalități de a obține același rezultat. Una dintre ele utilizează funcția cut (). Să presupunem că nu avem respondenți de peste 100 de ani.

Variabila rezultată este un factor al cărui nivel de valoare este înțeleasă intuitiv. Putem declara în mod explicit ordinea și valorile de nivel:

Folosind funcția recode ()

Un alt mod de a face același lucru este să utilizați funcția recode () a pachetului de mașini.

Rețineți că variabila obținută ca rezultat nu este un factor (nu toate variabilele de caractere sunt de tip "factor"). Putem folosi argumentul ca.factor.result al funcției recode (). dar în mod implicit va crea niveluri sortate în ordine alfabetică, ne va place mai mult dacă nivelul "Young" este primul.

Soluția tradițională este de a declara variabila un factor ordonat:

La aceeași variabilă Editați

Este greu să adăugați ceva nou aici. Doar din partea stângă și din dreapta a operatorului de atribuire "<-" мы используем имя одной и той же переменной:

Singurul truc apare la indexare. Să arătăm un exemplu:

Ca urmare a acestei operații, toate valorile au fost convertite în format de caractere, astfel încât încercările de a compara variabila cu numărul 60 nu vor conduce la nimic. Soluția pe care o propun aici este să creezi un obiect temporar, să îl folosești când indexăm variabila noastră și apoi să o ștergem.

Estesstvenno, toate celelalte tehnici cu niveluri și ordine rămân în vigoare.

Cum se salvează în format R? regulă

După cum știți, R oferă un număr mare de tipuri de obiecte: scalare, vectori, matrice, cadre de date, liste, tablouri și o serie de altele (dacă nu mă înșel, chiar și R poate fi considerat un obiect).

Deci, întrebarea este: cum să salvezi ce?

Deoarece R manipulează un număr mare de obiecte, de aceea înțelege multe formate de date (inclusiv fișiere .sav și .por).

Conform informațiilor obținute prin comanda "Data". Există patru formate de date acceptate cu următoarele extensii:

Dar această listă nu este obligatorie pentru execuție. Puteți numi fișierul cu orice nume cu orice extensie, deoarece atunci când citiți acest fișier, va fi necesar să specificați numele complet, inclusiv extensia.

De obicei, fișierele care conțin codul R (adică secvența instrucțiunilor de execuție) au extensia ".R".

O observație mai importantă: deoarece R poate lucra imediat cu multe obiecte în memorie în același timp (imaginați-vă două seturi de date SPSS încărcate în memorie deodată), vă permite de asemenea să scrieți câteva obiecte într-un singur fișier.

În exemplele următoare vom presupune că citirea și scrierea fișierelor se face în directorul curent (pentru referință, vezi getwd și? Setwd).

Următoarele exemple sunt de bază, există o mulțime de opțiuni suplimentare care vă permit să setați parametri suplimentari când salvați fișierele. Nu ezitați să contactați fișierele de ajutor pentru următoarele funcții.

dump () și sursa () Editați

Funcția dump () scrie o combinație de comenzi (de exemplu, așa cum am folosit pentru a crea matricea probă) și structura internă a matricei de date.

Codul R scrie, de obicei, fișiere cu extensia ".R", deci alegem aceeași extensie:

În pasul următor, putem folosi comenzile din fișierul "test.R" folosind funcția source ():

Pe disc, fișierul "test.R" este scris în text simplu, deci este destul de lizibil. Puteți să vă uitați la el pentru a înțelege principiul dump ().

salvați () și încărcați () Editați

Acest mod de salvare a obiectelor R este cel mai fiabil și îl recomand pentru aplicare. În acest caz, informațiile sunt scrise în format binar și, prin urmare, fișierele nu pot fi citite de către persoană.

Un mare avantaj al funcției save () este dimensiunea redusă a fișierelor primite. Ele pot fi comprimate suplimentar (sau prin aplicarea argumentului "compress" sau compresia ulterioară a utilitarului gzip), iar R va citi aceste fișiere fără probleme.

Sintaxa unei funcții este foarte simplă:

Prima diferență față de funcția dump (). primul argument nu este inclus în ghilimele. Pentru a înțelege de ce, consultați ajutorul pentru ambele funcții.

Citirea datelor este simplă:

În plus, dacă utilizatorul dorește să salveze toate obiectele aflate în memorie, putem salva întregul spațiu de lucru utilizând funcția save.image ()

dput () și dget () Edit

Funcția dput () are aproape același lucru ca și dump (). dar cu o diferență: rezultatul execuției funcției nu este instrucțiunea R. Rezultatul conține numai structura internă a obiectului.

Aici am folosit extensia ".Rdput" (extinderea poate fi orice). Este foarte util să folosiți argumentul control = "all". aceasta va garanta că structura internă a obiectului va fi scrisă complet în fișier (inclusiv toate atributele obiectului).

Am citit datele de pe disc:

O altă diferență față de comanda dump () este crearea explicită a unui obiect, atunci când în versiunea anterioară obiectul este creat prin instrucțiuni scrise în fișier.

write.table () și read.table () Edit

Funcția write.table () creează o reprezentare ASCII a matricei de date, extensia numelui fișierului de ieșire fiind ".tab", ".txt" sau ".csv" în funcție de tipul de delimitator (argumentul sep).

Fișierul de ieșire va pierde întreaga structură internă a obiectului, adică pe ea nu putem judeca dacă variabila este un factor sau un factor ordonat etc.

Pentru fișierele delimitate în fișiere, instrucțiunea va fi următoarea:

De obicei, datele SPSS nu au nume de rânduri (cum ar fi nume de variabile). R, la rândul său, conține astfel de nume (încă un motiv pentru a prefera R), deci dacă doriți să obțineți nume de variabile, setați valoarea argumentului corespunzător (antet) la TRUE.

Funcția read.table () este una dintre cele mai utile, are multe argumente. Forma minimă de aplicare este următoarea:

Pentru un fișier cu valori separate prin virgule, comanda este aceeași, numai modificările sep argument:

scrieți () Editați

Funcția este utilizată pentru a scrie rapid un vector sau o matrice într-un fișier.

În cazul unui vector, dacă acesta este un vector de caractere, acesta va fi scris în fișierul implicit într-o coloană; dacă vectorul este numeric, atunci trebuie să utilizați argumentul ncolumns:

În cazul unei matrice, trebuie să o transpunem înainte de a scrie în fișier:

Fișierul de ieșire nu conține numele rândurilor și coloanelor.

.saveRDS () și .readRDS () Editați

Această abordare este recomandată utilizatorilor îndrăzneți.

Observați prezența punctelor la începutul numelor funcțiilor.

Uneori există o situație în care este necesară stocarea obiectelor R într-o bază de date similară cu MySQL. De obicei, acest lucru se datorează faptului că matricea de date este foarte mare.

Această operație este simplă pentru seturile de date (dataframe) - au o structură similară structurii bazei de date. Pentru obiecte mai complexe, cum ar fi liste sau chiar matrice, o astfel de stocare directă este pur și simplu imposibilă.

R poate converti oricare din obiectele sale în formă binară, ca în formatul BLOB (obiect binar mare) sau în reprezentarea sa ASCII. Această conversie este numită serializare și oferă un mare avantaj, deoarece Un obiect serializat nu este altceva decât un vector simplu (cum ar fi o coloană într-un tabel MySQL).

Pentru a serializa un obiect, utilizați funcția serialize (). Pentru a transforma un obiect serializat într-o stare normală, utilizați unserialize ().

Funcția .saveRDS () vă permite să salvați un obiect serializat în directorul curent. readRDS () îl citește înapoi.

Această comandă va salva versiunea ASCII comprimată a obiectului serializat R. Dacă sunteți interesat de ceea ce arata obiectul serializat, procedați în felul următor:

Pentru informații mai detaliate despre R în limba rusă, consultați: