Programmering

R tutorial: Slik importerer du data til R

Få hele boka
Praktisk R for massekommunikasjon og journalistikk MSRP $ 59,95 Se den

Denne artikkelen ble hentet fra "Practical R for Mass Communication and Journalism" med tillatelse fra forlaget. © 2019 av Taylor & Francis Group, LLC.

Før du kan analysere og visualisere data, må du få disse dataene inn i R. Det er forskjellige måter å gjøre dette på, avhengig av hvordan dataene dine er formatert og hvor de ligger.

Vanligvis avhenger funksjonen du bruker for å importere data, av filens format. I base R kan du for eksempel importere en CSV-fil med read.csv (). Hadley Wickham opprettet en pakke som heter readxl som, som du kanskje forventer, har en funksjon å lese i Excel-filer. Det er en annen pakke, googlesheets, for å hente inn data fra Google-regneark.

Men hvis du ikke vil huske alt det, er det Rio.

Magien til Rio

“Målet med rio er å gjøre datafilen I / O [import / output] i R så enkel som mulig ved å implementere tre enkle funksjoner i sveitsisk hærknivstil, ifølge prosjektets GitHub-side. Disse funksjonene er import(), eksport(), og konvertere().

Så, rio-pakken har bare en funksjon å lese i mange forskjellige typer filer: import(). Hvis du import ("myfile.csv"), det vet å bruke en funksjon for å lese en CSV-fil. import ("myspreadsheet.xlsx") fungerer på samme måte. Faktisk håndterer rio mer enn to dusin formater, inkludert tabulatoradskilte data (med utvidelsen .tsv), JSON, Stata og data med fast bredde (.fwf).

Pakker som trengs for denne opplæringen

  • rio
  • htmltab
  • readxl
  • googlesheets
  • Pac Man
  • vaktmester
  • rmiscutils (pm GitHub) eller readr
  • tibble

Når du har analysert dataene dine, hvis du vil lagre resultatene som et CSV-, Excel-regneark eller andre formater, Rio's eksport() funksjon kan takle det.

Hvis du ikke allerede har rio-pakken på systemet ditt, installerer du det nå med install.packages ("rio").

Jeg har satt opp noen eksempeldata med snøfalldata fra Boston. Du kan gå til //bit.ly/BostonSnowfallCSV og høyreklikke for å lagre filen som BostonWinterSnowfalls.csv i din nåværende R-prosjektarbeidskatalog. Men et av poengene med manus er å erstatte manuelt arbeid - kjedelig eller på annen måte - med automatisering som er lett å reprodusere. I stedet for å klikke for å laste ned, kan du bruke R’er Last ned fil funksjon med syntaksen download.file ("url", "destinationFileName.csv"):

nedlastingsfil ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv")

Dette forutsetter at systemet vil omdirigere fra den Bit.ly URL-snarveien og vellykket finne den virkelige fil-URL, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. Jeg har av og til hatt problemer med å få tilgang til nettinnhold på gamle Windows-PCer. Hvis du har en av disse, og denne Bit.ly-lenken ikke fungerer, kan du bytte inn den faktiske nettadressen for Bit.ly-lenken. Et annet alternativ er å oppgradere Windows-PCen din til Windows 10 hvis mulig for å se om det gjør susen.

Hvis du ønsker at Rio bare kunne importere data direkte fra en URL, kan det faktisk, og jeg kommer til det i neste avsnitt. Poenget med dette seksjonen er å få praksis med å arbeide med en lokal fil.

Når du har testfilen på ditt lokale system, kan du laste dataene inn i et R-objekt kalt snødata med koden:

snødata <- rio :: import ("BostonWinterSnowfalls.csv")

Vær oppmerksom på at det er mulig at rio vil be deg om å laste ned filen på nytt i binært format, i så fall må du kjøre

download.file ("// bit.ly/BostonSnowfallCSV", "BostonWinterSnowfalls.csv", mode = "wb")

Sørg for å bruke RStudios alternativ for fullføring av faner. Hvis du skriver rio :: og vent, du får en liste over alle tilgjengelige funksjoner. Type snø og vent, og du bør se det fulle navnet på objektet ditt som et alternativ. Bruk piltastene opp og ned for å bytte mellom forslag til automatisk fullføring. Når alternativet du ønsker er uthevet, trykker du på Tab-tasten (eller Enter) for å få hele objektet eller funksjonsnavnet lagt til skriptet.

Du burde se objektet snødata vises i miljøfanen i RStudio-øvre høyre rute. (Hvis den øverste høyre ruten viser kommandolinjen i stedet for miljøet ditt, velger du kategorien Miljø.)

Taylor & Francis Group

snødata skal vise at den har 76 "obs." - observasjoner eller rader - og to variabler eller kolonner. Hvis du klikker på pilen til venstre for snødata for å utvide oppføringen, ser du de to kolonnene og hvilken type data hver kolonne inneholder. De Vinter er karakterstrenger og Total kolonne er numerisk. Du bør også kunne se de første verdiene i hver kolonne i Miljø-ruten.

Taylor & Francis Group

Klikk på ordet snødata i kategorien Miljø for å få et mer regnearklignende syn på dataene dine. Du kan få den samme visningen fra R-konsollen med kommandoen Visning (snødata) (det må være en hovedstad V på utsikten -utsikt vil ikke fungere). Merk: snødata er ikke anførselstegn fordi du henviser til navnet på et R-objekt i miljøet ditt. I rio :: import kommando før, BostonWinterSnowfalls.csv er i anførselstegn fordi det ikke er et R-objekt; det er et tegnstrengnavn på en fil utenfor R.

Taylor & Francis Group

Denne visningen har et par regnearklignende atferd. Klikk på en kolonneoverskrift for å sortere den etter kolonnens verdier i stigende rekkefølge. klikk på den samme kolonneoverskriften en gang til for å sortere i synkende rekkefølge. Det er et søkefelt for å finne rader som samsvarer med bestemte tegn.

Hvis du klikker på Filter-ikonet, får du et filter for hver kolonne. De Vinter tegnkolonne fungerer som du forventer, og filtrerer etter eventuelle rader som inneholder tegnene du skriver inn. Hvis du klikker i Total i den numeriske kolonnens filter, viser eldre versjoner av RStudio en glidebryter mens nyere viser et histogram og en rute for filtrering.

Importer en fil fra nettet

Hvis du vil laste ned og importere en fil fra nettet, kan du gjøre det hvis den er offentlig tilgjengelig og i et format som Excel eller CSV. Prøve

snødata <- rio :: import ("// bit.ly/BostonSnowfallCSV", format)

Mange systemer kan følge omdirigerings-URL til filen selv etter at de først har gitt deg en feilmelding, så lenge du angir formatet som "csv" fordi filnavnet her ikke inkluderer .csv. Hvis din ikke fungerer, bruker du nettadressen //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv i stedet.

rio kan også importere velformaterte HTML-tabeller fra nettsider, men tabellene må være ekstremt godt formatert. La oss si at du vil laste ned tabellen som beskriver National Weather Service's alvorlighetsgrad for snøstorm. The National Centers for Environmental Information Regional Snowfall Index-siden har bare en tabell, veldig godt laget, så kode som denne skal fungere:

rsi_description <- rio :: import ("//www.ncdc.noaa.gov/snow-and-ice/rsi/", format = "html")

Merk igjen at du må ta med formatet, i dette tilfellet format = "html" . fordi nettadressen i seg selv ikke gir noen indikasjon på hva slags fil det er. Hvis URL-en inneholdt et filnavn med en .html utvidelse, ville Rio vite.

I det virkelige liv vises webdata sjelden i en så pen, isolert form. Et godt alternativ for saker som ikke er like godt utformet, er ofte htmltab-pakken. Installer den med install.packages ("htmltab"). Pakkens funksjon for å lese en HTML-tabell kalles også htmltab. Men hvis du kjører dette:

bibliotek (htmltab) bytabell <- htmltab ("// no.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (bytabell)

du ser at du ikke har riktig tabell, fordi datarammen inneholder ett objekt. Fordi jeg ikke spesifiserte hvilken tabellen, trakk den den første HTML-tabellen på siden. Det skjedde ikke den jeg vil ha. Jeg har ikke lyst til å importere hver tabell på siden før jeg finner den rette, men heldigvis har jeg en Chrome-utvidelse kalt Table Capture som lar meg se en liste over tabellene på en side.

Sist jeg sjekket, var tabell 5 med mer enn 300 rader den jeg ønsket. Hvis det ikke fungerer for deg nå, kan du prøve å installere Table Capture i en Chrome-nettleser for å sjekke hvilken tabell du vil laste ned.

Jeg prøver igjen, spesifiserer tabell 5 og ser deretter hvilke kolonnenavn som er i den nye bytabellen. Merk at i følgende kode setter jeg bytabell <- htmltab () kommandoen på flere linjer. Det er slik at det ikke gikk over marginene - du kan holde alt på en linje. Hvis tabellnummeret har endret seg siden denne artikkelen ble lagt ut, erstatt det som = 5 med riktig nummer.

I stedet for å bruke siden på Wikipedia, kan du erstatte Wikipedia-URL-en med URL-en til en kopi av filen jeg opprettet. Denne filen er på //bit.ly/WikiCityList. For å bruke den versjonen, skriv inn bit.ly/WikiCityList i en nettleser, og kopier deretter den lange URLen den omdirigerer til og bruker at i stedet for Wikipedia-URL i koden nedenfor:

bibliotek (htmltab) bytabell <- htmltab ("// no.wikipedia.org/wiki/List_of_United_States_cities_by_population", which = 5) colnames (citytable)

Hvordan visste jeg det hvilken var argumentet jeg trengte for å spesifisere tabellnummeret? Jeg leste htmltab hjelpefilen ved hjelp av kommandoen ? htmltab. Det inkluderte alle tilgjengelige argumenter. Jeg skannet mulighetene, og “hvilken en vektor med lengde en for identifikasjon av tabellen i dokumentet ”så riktig ut.

Legg også merke til at jeg brukte colnames (citytable) i stedet for navn (bytabell) for å se kolonnenavnene. Enten vil fungere. Base R har ogsåetternavn () funksjon.

Uansett er disse resultatene mye bedre, selv om du kan se fra å løpe str (bytabell) at et par kolonner som skulle være tall kom inn som tegnstrenger. Du kan se dette både ved kr ved siden av kolonnenavnet og anførselstegnene rundt verdier som 8,550,405.

Dette er en av Rs små irritasjoner: R forstår det generelt ikke 8,550 er et tall. Jeg taklet dette problemet selv ved å skrive min egen funksjon i min egen rmiscutils-pakke for å gjøre alle de "tegnstrenger" som virkelig er tall med komma tilbake til tall. Alle kan laste ned pakken fra GitHub og bruke den.

Den mest populære måten å installere pakker fra GitHub er å bruke en pakke som heter devtools. devtools er en ekstremt kraftig pakke designet hovedsakelig for folk som ønsker å skrive sine egen pakker, og det inkluderer noen måter å installere pakker fra andre steder enn CRAN. Imidlertid krever devtools vanligvis et par ekstra trinn å installere i forhold til en typisk pakke, og jeg vil legge igjen irriterende systemadministratoroppgaver til det er helt nødvendig.

Imidlertid installerer pacman-pakken også pakker fra ikke-CRAN-kilder som GitHub. Hvis du ikke har gjort det ennå, kan du installere pacman med install.packages ("pacman").

pacman’s p_install_gh ("brukernavn / pakkerepo") funksjonen installeres fra en GitHub repo.

p_load_gh ("brukernavn / pakkerepo")laster en pakke i minnet hvis den allerede finnes på systemet ditt, og den først installeres og laster deretter en pakke fra GitHub hvis pakken ikke eksisterer lokalt.

Min rmisc-verktøypakke finner du på smach / rmiscutils. Løpe pacman :: p_load_gh ("smach / rmiscutils") for å installere rmiscutils-pakken min.

Merk: En alternativ pakke for å installere pakker fra GitHub kalles fjernkontroller, som du kan installere viainstall.packages ("fjernkontroller"). Hovedformålet er å installere pakker fra eksterne lagringssteder som GitHub. Du kan se på hjelpefilen med hjelp (pakke = "fjernkontroller").

Og muligens den smidigeste av alt er en pakke som heter githubinstall. Det tar sikte på å gjette repoen der en pakke ligger. Installer den viainstall.packages ("githubinstall"); så kan du installere rmiscutils-pakken min ved hjelp avgithubinstall :: gh_install_packages ("rmiscutils"). Du blir spurt om du vil installere pakken på smach / rmisutils (du gjør).

Nå som du har installert min samling av funksjoner, kan du bruke min number_with_commas () funksjon for å endre tegnstrengene som skal være tall tilbake til tall. Jeg anbefaler på det sterkeste å legge til en ny kolonne i datarammen i stedet for å endre en eksisterende kolonne - det er god praksis for dataanalyse uansett hvilken plattform du bruker.

I dette eksemplet vil jeg kalle den nye kolonnen PopEst2017. (Hvis tabellen er oppdatert siden, bruk passende kolonnenavn.)

bibliotek (rmiscutils) bytabell $ PopEst2017 <- number_with_commas (bytabell $ `2017 estimat`)

Min rmiscutils-pakke er forresten ikke den eneste måten å håndtere importerte tall som har komma. Etter at jeg opprettet rmiscutils-pakken min og dens number_with_commas () funksjon ble tidyverse readr-pakken født. readr inkluderer også en funksjon som gjør tegnstrenger til tall, parse_number ().

Etter at du har installert readr, kan du generere tall fra estimatkolonnen 2017 med readr:

bytabell $ PopEst2017 <- readr :: parse_number (bytabell $ `2017 estimat`)

En fordel med readr :: parse_number () er at du kan definere din egen sted () for å kontrollere ting som koding og desimalmerker, som kan være av interesse for ikke-USA-baserte lesere. Løpe ? parse_number for mer informasjon.

Merk: Hvis du ikke brukte utfylling av faner for anslagskolonnen for 2017, kan det hende du har hatt et problem med det kolonnenavnet hvis det har et mellomrom på det tidspunktet du kjører denne koden. Legg merke til at det er bakvendte anførselstegn i koden min`) rundt kolonnenavnet. Det er fordi det eksisterende navnet hadde et mellomrom, som du ikke skal ha i R. Det kolonnenavnet har et annet problem: Det starter med et tall, også generelt et R-nei. RStudio vet dette, og legger automatisk til de nødvendige tilbudsitatene rundt navnet med automatisk fullføring av fanen.

Bonustips: Det er en R-pakke (det er det selvfølgelig!) Som heter vaktmester som automatisk kan fikse plagsomme kolonnenavn importert fra en ikke-R-vennlig datakilde. Installer den med install.packages ("vaktmester"). Deretter kan du opprette nye rene kolonnenavn ved hjelp av vaktmester rene navn () funksjon.

Nå oppretter jeg en helt ny dataramme i stedet for å endre kolonnenavn på den opprinnelige datarammen min, og kjører vaktmesterens clean_names () på originaldataene. Sjekk deretter datarammen kolonnenavn med navn ():

citytable_cleaned <- vaktmester :: clean_names (citytable)

navn (bytabell_renset)

Du ser at mellomrommene er endret til understreker, som er lovlige i R-variabelnavn (som perioder). Og alle kolonnenavn som startet med et nummer, har nå et x i begynnelsen.

Hvis du ikke vil kaste bort minne ved å ha to kopier av stort sett de samme dataene, kan du fjerne et R-objekt fra arbeidsøkten din medrm () funksjon: rm (bytabell).

Importer data fra pakker

Det er flere pakker som lar deg få tilgang til data direkte fra R. One is quantmod, som lar deg trekke noen amerikanske regjerings- og økonomiske data direkte inn i R.

En annen er den passende navnet på værinformasjonspakken på CRAN. Det kan hente data fra Weather Underground API, som har informasjon for mange land rundt om i verden.

Rnoaa-pakken, et prosjekt fra rOpenSci-gruppen, tar i bruk flere forskjellige datasett for US National Oceanic and Atmospheric Administration, inkludert daglig klima-, bøye- og storminformasjon.

Hvis du er interessert i data fra staten eller lokale myndigheter i USA eller Canada, kan det være lurt å sjekke ut RSocrata for å se om et byrå du er interessert i å legge ut data der. Jeg har ennå ikke funnet en komplett liste over alle tilgjengelige Socrata-datasett, men det finnes en søkeside på //www.opendatanetwork.com. Vær imidlertid forsiktig: Det finnes sett som er lastet opp av fellesskapet sammen med offisielle myndighetsdata, så sjekk eieren av et datasett og last opp kilden før du stoler på det for mer enn R-praksis. "ODN-datasett" i et resultat betyr at det er en fil lastet opp av noen i allmennheten. Offisielle statlige datasett har en tendens til å leve på nettadresser som //data.CityOrStateName.gov og//data.CityOrStateName.us.

For flere dataimportpakker, se det søkbare diagrammet mitt på //bit.ly/RDataPkgs. Hvis du jobber med amerikanske myndighetsdata, kan det hende du er spesielt interessert i folketelling og tidycensus, som begge tar del i US Census Bureau-data. Andre nyttige myndighetsdatapakker inkluderer eu.us.opendata fra regjeringene i USA og EU for å gjøre det lettere å sammenligne data i begge regioner, og kansensus for kanadiske folketalldata.

Når dataene ikke er ideelt formatert

I alle disse eksempeldatasakene har dataene ikke bare vært godt formatert, men ideelle: Når jeg fant det, var det perfekt strukturert for R. Hva mener jeg med det? Den var rektangulær, med hver celle som hadde en enkelt verdi i stedet for sammenslåtte celler. Og den første raden hadde kolonneoverskrifter, i motsetning til for eksempel en tittelrad med stor skrift over flere celler for å se pen ut - eller ingen kolonneoverskrifter i det hele tatt.

Å håndtere uryddete data kan dessverre bli ganske komplisert. Men det er et par vanlige problemer som er enkle å fikse.

Begynnende rader som ikke er en del av dataene. Hvis du vet at de første radene i et Excel-regneark ikke har data du vil ha, kan du be rio om å hoppe over en eller flere linjer. Syntaksen er rio :: import ("mySpreadsheet.xlsx", skip = 3) for å ekskludere de tre første radene. hopp over tar et heltall.

Det er ingen kolonnenavn i regnearket. Standardimporten antar at den første raden på arket ditt er kolonnenavnene. Hvis dataene dine gjør ikke det har overskrifter, kan den første raden med dataene dine ende opp som kolonneoverskrifter. For å unngå det, bruk rio :: import ("mySpreadsheet.xlsx", col_names = FALSE) så R vil generere standardoverskrifter på X0, X1, X2 og så videre. Eller bruk en syntaks som rio :: import ("mySpreadsheet.xlsx", col_names = c ("City", "State", "Population")) for å angi dine egne kolonnenavn.

Hvis det er flere faner i regnearket, vises hvilken argument overstyrer standardverdien for lesing i det første regnearket. rio :: import ("mySpreadsheet.xlsx", som = 2) leser i det andre regnearket.

Hva er en dataramme? Og hva kan du gjøre med en?

rio importerer et regneark eller CSV-fil som en R Dataramme. Hvordan vet du om du har en dataramme? I tilfelle av snødata, klasse (snødata) returnerer klassen eller typen objekt det er. str (snødata) forteller deg også klassen og legger til litt mer informasjon. Mye av informasjonen du ser med str () ligner på det du så for dette eksemplet i RStudio-miljøruten: snødata har 76 observasjoner (rader) og to variabler (kolonner).

Datarammer er omtrent som regneark ved at de har kolonner og rader. Imidlertid er datarammer mer strukturert. Hver kolonne i en dataramme er en R vektor, som betyr at hvert element i en kolonne må være av samme datatype. En kolonne kan være alle tall og en annen kolonne kan være alle strenger, men i en kolonne må dataene være konsistente.

Hvis du har en datarammekolonne med verdiene 5, 7, 4 og "verdien som kommer", vil R ikke bare være ulykkelig og gi deg en feil. I stedet vil det tvinge alle verdiene til å være den samme datatypen. Fordi “verdien som kommer” ikke kan gjøres om til et tall, vil 5, 7 og 4 til slutt bli omgjort til tegnstrenger av "5", "7", og "4". Dette er vanligvis ikke det du vil ha, så det er viktig å være klar over hvilken type data som er i hver kolonne. En verdifull karakterstrengverdi i en kolonne på 1000 tall kan gjøre det hele om til tegn. Hvis du vil ha tall, må du sørge for at du har dem!

R har måter å referere til manglende data som ikke vil skru opp resten av kolonnene dine: NA betyr "ikke tilgjengelig."

Datarammer er rektangulære: Hver rad må ha samme antall oppføringer (selv om noen kan være tomme), og hver kolonne må ha samme antall elementer.

Excel-regnearkkolonner refereres vanligvis til med bokstaver: Kolonne A, Kolonne B, etc. Du kan referere til en datarammekolonne med navnet ved å bruke syntaksen dataFrameName $ columnName. Så hvis du skriver snødata $ Totalt og trykk Enter, du ser alle verdiene i Total som vist i figuren nedenfor. (Det er derfor når du kjører str (snødata) kommando, det er et dollartegn foran navnet på hver kolonne.)

Taylor & Francis Group

En påminnelse om at disse parentesnumrene til venstre for oppføringen ikke er en del av dataene; de forteller deg bare hvilken posisjon hver datalinje starter med. [1] betyr at linjen starter med det første elementet i vektoren, [10] den tiende osv.

RStudio-fullføring av faner fungerer med navn på datarammekolonner, samt navn på objekter og funksjoner. Dette er ganske nyttig for å forsikre deg om at du ikke stave feil i et kolonnenavn og bryte skriptet - og det sparer også å skrive hvis du har lange kolonnenavn.

Type snødata $ og vent, så ser du en liste over alle kolonnenavnene i snødata.

Det er enkelt å legge til en kolonne i en dataramme. For øyeblikket har Total kolonne viser vinter snøfall i tommer. For å legge til en kolonne som viser totaler i meter, kan du bruke dette formatet:

snødata $ meter <- snødata $ Totalt * 0,0254

Navnet på den nye kolonnen er til venstre, og det er en formel til høyre. I Excel har du kanskje brukt = A2 * 0,0254 og kopierte deretter formelen nedover i kolonnen. Med et skript trenger du ikke bekymre deg for om du har brukt formelen riktig på alle verdiene i kolonnen.

Nå ser på din snødata objekt i kategorien Miljø. Den skal ha en tredje variabel, Meter.

Fordi snødata er en dataramme, den har visse datarammeegenskaper som du har tilgang til fra kommandolinjen. nrow (snødata) gir deg antall rader og ncol (snødata) antall kolonner. Ja, du kan se dette i RStudio-miljøet for å se hvor mange observasjoner og variabler det er, men det vil sannsynligvis være tider når du vil vite dette som en del av et skript. colnames (snødata) eller navn (snødata) gir deg navnet på snødata kolonner. navn (snødata) gi deg noen radnavn (hvis ingen var angitt, vil det som standard være tegnstrenger av radnummeret som f.eks "1", "2", "3", etc.).

Noen av disse spesielle datarammefunksjonene, også kjent som metoder, ikke bare gi deg informasjon, men lar deg endre egenskapene til datarammen. Så, navn (snødata) forteller deg kolonnenavnene i datarammen, men

navn (snødata) <- c ("Winter", "SnowInches", "SnowMeters")

Endringer kolonnenavnene i datarammen.

Du trenger sannsynligvis ikke å vite alle tilgjengelige metoder for et datarammeobjekt, men hvis du er nysgjerrig, metoder (klasse = klasse (snødata)) viser dem. For å finne ut mer om hvilken som helst metode, kjør den vanlige hjelpespørsmålet med et spørsmålstegn, for eksempel ?slå sammen eller ? delmengde.

Når et nummer egentlig ikke er et tall

Postnummer er et godt eksempel på "tall" som egentlig ikke skal behandles som sådan. Selv om det er teknisk numerisk, er det ikke fornuftig å gjøre ting som å legge til to postnummer sammen eller ta et gjennomsnitt av postnummer i et fellesskap. Hvis du importerer en postnummerkolonne, vil R sannsynligvis gjøre den til en tallkolonne. Og hvis du har å gjøre med områder i New England der postnummer starter med 0, vil 0 forsvinne.

Jeg har en tabellavgrenset fil med postnummer i Boston etter nabolag, lastet ned fra et myndighetsorgan i Massachusetts, på //raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt. Hvis jeg prøvde å importere den med glidelåser <- rio :: import ("bostonzips.txt"), ville postnummerene komme inn som 2118, 2119, etc. og ikke 02118, 02119, og så videre.

Det er her det hjelper å vite litt om den underliggende funksjonen som rio’s import() funksjonen bruker. Du kan finne de underliggende funksjonene ved å lese import hjelp fil på ?import. For å hente inn tabsskilte filer, import bruker enten fread () fra data.table-pakken eller base R’ene read.table () funksjon. De ? lese.tabell hjelp sier at du kan spesifisere kolonneklasser med colClasses argument.

Opprett en datakatalog i din nåværende prosjektkatalog, og last deretter ned filen bostonzips.txt med

download.file ("// raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt", "data / bostonzips.txt")

Hvis du importerer denne filen og angir begge kolonnene som tegnstrenger, vil postnummerene komme i riktig format:

glidelåser <- rio :: import ("data / bostonzips.txt", colClasses = c ("tegn" "," tegn ")) str (glidelås)

Merk at kolonneklassene må stilles inn ved hjelp av c () funksjon, c ("karakter", "karakter"). Hvis du prøvde colClasses, "karakter", får du en feilmelding. Dette er en typisk feil for nybegynnere, men det bør ikke ta lang tid å komme inn i c () vane.

Et tips om å spare deg selv: å skrive ut c ("karakter", "karakter") er ikke så vanskelig; men hvis du har et regneark med 16 kolonner der de første 14 må være tegnstrenger, kan dette bli irriterende. R’s rep () funksjon kan hjelpe. rep (), som du kanskje har gjettet, gjentar det elementet du gir det, men så mange ganger du forteller det til, ved hjelp av formatet rep (myitem, numtimes). rep ("karakter", 2) er det samme som c ("karakter", "karakter"), så colClasses = rep ("tegn", 2) tilsvarer colClasses = c ("tegn", "tegn") . Og, colClasses = c (rep ("tegn", 14), rep ("numerisk", 2)) setter de første 14 kolonnene som tegnstrenger og de to siste som tall. Alle navnene på kolonneklasser her må være i anførselstegn fordi navn er tegnstrenger.

Jeg foreslår at du leker litt med rep () slik at du blir vant til formatet, siden det også er en syntaks som andre R-funksjoner bruker.

Enkle eksempeldata

R kommer med noen innebygde datasett som er enkle å bruke hvis du vil leke med nye funksjoner eller andre programmeringsteknikker. De brukes også mye av folk som underviser i R, siden instruktører kan være sikre på at alle studenter begynner med de samme dataene i nøyaktig samme format.

Type data() for å se tilgjengelige innebygde datasett i base R og de installerte pakkene som er lastet inn. data (pakke = .pakker (all.tilgjengelig = SANT)) fra base R viser alle mulige datasett fra pakker som er installert i systemet ditt, uansett om de er lastet inn i minnet eller ikke i din nåværende arbeidsøkt.

Du kan få mer informasjon om et datasett på samme måte som du får hjelp med funksjoner: ? datasettnavn eller hjelp ("datasettnavn"). mtcars og iris er blant de jeg har sett brukt ofte.

Hvis du skriver mtcars, skrives hele mtcars-datasettet ut i konsollen. Du kan bruke hode() funksjon for å se på de første radene med hode (mtcars).

Du kan lagre datasettet i en annen variabel hvis du vil, med et format som cardata <- mtcars.

Eller kjører datafunksjonen med datasettnavnet, for eksempel data (mtcars), laster datasettet inn i arbeidsmiljøet ditt.

En av de mest interessante pakkene med eksempeldatasett for journalister er fivethirtyeight-pakken, som har data fra historier publisert på FiveThirtyEight.com-nettstedet. Pakken ble laget av flere akademikere i samråd med FiveThirtyEight-redaktører; den er designet for å være en ressurs for undervisning i lavere statistikk.

Ferdigpakket data kan være nyttig - og i noen tilfeller morsomt. I den virkelige verden bruker du kanskje ikke data som er ganske så praktisk pakket.

Opprett en dataramme manuelt i R

Sjansen er stor for at du ofte vil håndtere data som starter utenfor R, og du importerer fra et regneark, CSV-fil, API eller annen kilde. Men noen ganger vil du kanskje bare skrive inn en liten mengde data direkte i R, eller på annen måte opprette en dataramme manuelt. Så la oss ta en rask titt på hvordan det fungerer.

R datarammer er samlet kolonne for kolonne som standard, ikke en rad av gangen. Hvis du ønsket å samle en rask dataramme for byvalgresultatene, kan du opprette en vektor med kandidatnavn, en andre vektor med deres partitilhørighet, og deretter en vektor av deres stemmer:

kandidater <- c ("Smith", "Jones", "Write-ins", "Blanks")

parti <- c ("demokrat", "republikansk", "", "")

stemmer <- c (15248, 16723, 230, 5234)

Husk å ikke bruke komma i tallene dine, som du kanskje gjør i Excel.

For å lage en dataramme fra disse kolonnene, bruk Dataramme() funksjon og synatx data.frame (kolonne1, kolonne2, kolonne3).

myresults <- data.frame (kandidater, parti, stemmer)

Sjekk strukturen med str ():

str (myresults)

Mens kandidatene og partiet vektorer er karakterer, kandidatene og partiet datarammekolonner har blitt omgjort til en klasse av R-objekter kalt faktorer. Det er litt for in-the-weeds på dette tidspunktet å fordype seg i hvordan faktorer er forskjellige fra tegn, bortsett fra å si det

  1. Faktorer kan være nyttige hvis du vil bestille varer på en bestemt, ikke-alfabetisk måte for tegning og andre formål, for eksempel Fattige er mindre enn Rettferdig er mindre enn God er mindre enn Utmerket.
  2. Faktorer kan oppføre seg annerledes enn du kan forvente til tider. Jeg anbefaler å holde med tegnstrenger med mindre du har en god grunn til å spesifikt ønske faktorer.

Du kan holde karakterstrengene dine intakte når du oppretter datarammer ved å legge til argumentet stringsAsFactors = FALSE:

myresults <- data.frame (kandidater, parti, stemmer, stringsAsFactors = FALSE) str (myresults)

Nå er verdiene det du forventet.

Det er en ting til jeg må advare deg om når jeg lager datarammer på denne måten: Hvis en kolonne er kortere enn den / de andre, vil R noen ganger gjenta data fra den kortere kolonnen -om du vil at det skal skje eller ikke.

Si for eksempel at du opprettet valgresultatkolonnene for kandidater og parti, men bare skrev inn stemmeresultater for Smith og Jones, ikke for skrivinger og blanks. Du kan forvente at datarammen vil vise de to andre oppføringene som tomme, men du tar feil. Prøv det og se, ved å lage en ny stemmervektor med bare to tall, og bruke den nye stemmervektoren til å lage en annen dataramme:

stemmer <- c (15248, 16723)

myresults2 <- data.frame (kandidater, parti, stemmer)

str (myresults2)

Det stemmer, R brukte de to første numrene på nytt, noe som absolutt er ikke hva du vil ha. Hvis du prøver dette med tre tall i avstemningsvektoren i stedet for to eller fire, vil R kaste en feil. Det er fordi hver oppføring ikke kunne resirkuleres like mange ganger.

Hvis du nå tenker: "Hvorfor kan jeg ikke lage datarammer som ikke endrer strenger til faktorer automatisk? Og hvorfor må jeg bekymre meg for at datarammer bruker en kolonnes data hvis jeg glemmer å fullføre alle dataene? " Hadley Wickham hadde den samme tanken. Tibble-pakken hans skaper en R-klasse, også kalt tibble, som han sier er en “moderne ta på datarammer. De holder på funksjonene som har stått tidstesten, og slipper funksjonene som pleide å være praktiske, men som nå er frustrerende. "

Hvis dette appellerer til deg, installerer du tibble-pakken hvis den ikke er på systemet ditt, og deretter prøver du å lage en tibble med

myresults3 <- tibble :: tibble (kandidater, parti, stemmer)

og du får en feilmelding om at stemmekolonnen må være enten fire eller fire varer lang (tibble () gjentar et enkelt element så mange ganger som nødvendig, men bare for ett element).

Sett stemmekolonnen tilbake til fire oppføringer hvis du vil lage en tibble med disse dataene:

bibliotek (tibble)

stemmer <- c (15248, 16723, 230, 5234)

myresults3 <- tibble (kandidater, parti, stemmer)

str (myresults3)

Den ser ut som en dataramme - faktisk den er en dataramme, men med spesiell oppførsel, for eksempel hvordan den skrives ut. Legg også merke til at kandidatkolonnen er tegnstrenger, ikke faktorer.

Hvis du liker denne oppførselen, fortsett og bruk smågodt. Men gitt hvor vanlige konvensjonelle datarammer forblir i R, er det fortsatt viktig å vite om deres standardatferd.

Eksporterer data

Ofte etter at du har slått dataene dine i R, vil du lagre resultatene dine. Her er noen av måtene å eksportere dataene dine som jeg pleier å bruke mest:

Lagre i en CSV-fil med rio :: eksport (myObjectName, file = "myFileName.csv") og til en Excel-fil med rio :: eksport (myObjectName, file = "myFileName.xlsx"). rio forstår hvilket filformat du ønsker basert på utvidelsen av filnavnet. Det er flere andre tilgjengelige formater, inkludert .tsv for tabulatoradskilte data, .json for JSON, og .xml for XML.

Lagre til et R-binært objekt som gjør det enkelt å laste tilbake til R i fremtidige økter. Det er to alternativer.

Generisk lagre() lagrer ett eller flere objekter i en fil, for eksempel lagre (objectName1, objectName2, file = "myfilename.RData"). For å lese disse dataene tilbake til R, bruker du bare kommandoen last ("myfilename.RData") og alle gjenstandene kommer tilbake med samme navn i samme tilstand som de hadde før.

Du kan også lagre et enkelt objekt i en fil med saveRDS (myobject, file = "filnavn.rds"). Den logiske antagelsen er at loadRDS vil lese filen inn igjen, men i stedet er kommandoen readRDS—Og i dette tilfellet er bare dataene lagret, ikke objektnavnet. Så du må lese dataene inn i et nytt objektnavn, for eksempel mydata <- readRDS ("filnavn.rds").

Det er en tredje måte å lagre et R-objekt spesielt for R: generere R-kommandoene som vil gjenskape objektet i stedet for objektet med endelige resultater. Basis R-funksjonene for å generere en R-fil for å gjenskape et objekt er dput () eller dump (). Imidlertid finner jeg rio :: eksport (myobject, "mysavedfile.R") enda lettere å huske.

Til slutt er det flere måter å lagre filer som optimaliserer for lesbarhet, hastighet eller komprimering, noe jeg nevner i tilleggsressursdelen på slutten av denne artikkelen.

Du kan også eksportere et R-objekt til Windows eller Mac-utklippstavlen din med rio: rio :: eksport (myObjectName, format). Og du kan importere data til R fra utklippstavlen på samme måte: rio :: import (fil).

Bonus: rio’s konvertere() -funksjonen lar deg - du gjettet det - konvertere en filtype til en annen uten å måtte trekke dataene manuelt inn i og deretter ut av R. Se ?konvertere for mer info.

Avsluttende punkt: RStudio lar deg klikke for å importere en fil uten å måtte skrive kode i det hele tatt. Dette er ikke noe jeg anbefaler før du er komfortabel med å importere fra kommandolinjen, for jeg synes det er viktig å forstå koden bak import. Men jeg innrømmer at dette kan være en praktisk snarvei.

I kategorien Filer i RStudios nederste høyre rute, naviger til filen du vil importere, og klikk på den. Du får se et alternativ for å enten vise fil eller importere datasett. Velg Importer datasett for å se en dialogboks som forhåndsviser dataene, lar deg endre hvordan dataene importeres og forhåndsvise koden som skal genereres.

Gjør hvilke endringer du vil, og klikk på Importer, så blir dataene dine dratt inn i R.

Tilleggsressurser

rio alternativer. Mens Rio er en flott sveitsisk hærkniv for filhåndtering, kan det være tider når du vil ha litt mer kontroll over hvordan dataene dine blir trukket inn eller lagret fra R. I tillegg har det vært tider da jeg har hatt en utfordrende datafilen som Rio kvalt seg, men en annen pakke kunne håndtere den. Noen andre funksjoner og pakker du kanskje vil utforske:

  • Base R’er read.csv () og read.table () for å importere tekstfiler (bruk ? read.csv og ? lese.tabell for å få mer informasjon). stringsAsFactors = FALSE er nødvendig med disse hvis du vil beholde karakterstrenger som karakterstrenger. skriv.csv () lagrer til CSV.
  • rio bruker Hadley Wickhams readxl-pakke for å lese Excel-filer. Et annet alternativ for Excel er openxlsx, som kan skrive til en Excel-fil så vel som å lese en. Se på openxlsx-pakkevignettene for informasjon om formatering av regneark mens du eksporterer.
  • Wickhams readr-pakke er også verdt å se på som en del av "tidyverse". readr inkluderer funksjoner for å lese CSV, tabulaseparert, fast bredde, weblogger og flere andre typer filer. readr skriver ut hvilken type data den har bestemt for hver kolonne - heltall, tegn, dobbelt (ikke-heltall) osv. Det skaper småting.

Importer direkte fra et Google-regneark. Googlesheets-pakken lar deg importere data fra et Google Sheets-regneark, selv om det er privat, ved å autentisere Google-kontoen din. Pakken er tilgjengelig på CRAN; installer den viainstall.packages ("googlesheets"). Etter å ha lastet den med bibliotek ("googlesheets"), les den utmerkede innledende vignetten. I skrivende stund var intro-vignetten tilgjengelig i R kl vignett ("grunnleggende bruk", pakke = "googlesheets"). Hvis du ikke ser det, kan du prøve hjelp (pakke = "googlesheets") og klikk på koblingen Brukerhåndbøker, pakkevignetter og annen dokumentasjon for tilgjengelige vignetter, eller se på pakkeinformasjonen på GitHub på //github.com/jennybc/googlesheets.

Skrap data fra websider med rvest-pakken og nettleserutvidelsen SelectorGadget eller JavaScript-bokmerke. SelectorGadget hjelper deg med å oppdage CSS-elementene til data du vil kopiere som er på en HTML-side; deretter bruker rvest R for å finne og lagre dataene. Dette er ikke en teknikk for råbegynnere, men når du har litt R-erfaring under beltet, kan det være lurt å komme tilbake og gå tilbake til dette. Jeg har noen instruksjoner og en video om hvordan du gjør dette på //bit.ly/Rscraping. RStudio har også et webinar tilgjengelig på forespørsel.

Alternativer for å basere R's lagre og lese-funksjoner. Hvis du jobber med store datasett, kan hastighet bli viktig for deg når du lagrer og laster filer. Data.table-pakken har en rask fread () funksjon, men pass på at resulterende objekter er datatabeller og ikke vanlige datarammer; noen atferd er forskjellige. Hvis du vil ha en konvensjonell dataramme, kan du få en med as.data.frame (mydatatable) syntaks. Data.table-pakken er fwrite () funksjon er rettet mot å skrive til en CSV-fil betydelig raskere enn base R’er skriv.csv ().

To andre pakker kan være av interesse for lagring og henting av data. Fjærpakken lagres i et binært format som kan leses inn i R eller Python. Og den første pakken read.fst () og skriv.fst () tilbyr rask lagring og lasting av R-datarammeobjekter - pluss muligheten for filkomprimering.

$config[zx-auto] not found$config[zx-overlay] not found