Programmering

R tutorial: Sådan importeres data til R

Få den komplette bog
Praktisk R til massekommunikation og journalistik MSRP $ 59,95 Se det

Denne artikel blev uddraget af "Practical R for Mass Communication and Journalism" med tilladelse fra udgiveren. © 2019 af Taylor & Francis Group, LLC.

Inden du kan analysere og visualisere data, skal du få disse data til R. Der er forskellige måder at gøre dette på, afhængigt af hvordan dine data er formateret, og hvor de er placeret.

Normalt afhænger den funktion, du bruger til at importere data, af datas filformat. I base R kan du for eksempel importere en CSV-fil med read.csv (). Hadley Wickham oprettede en pakke kaldet readxl, der, som du måske forventer, har en funktion at læse i Excel-filer. Der er en anden pakke, googlesheets, til at hente data fra Google-regneark.

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

Rio's magi

"Målet med rio er at gøre datafil I / O [import / output] i R så let som muligt ved at implementere tre enkle funktioner i schweizisk hærknivstil," ifølge projektets GitHub-side. Disse funktioner er importere(), eksport()og konvertere().

Så rio-pakken har kun en funktion til at læse i mange forskellige typer filer: importere(). hvis du import ("myfile.csv"), det ved at bruge en funktion til at læse en CSV-fil. import ("myspreadsheet.xlsx") fungerer på samme måde. Faktisk håndterer rio mere end to dusin formater, herunder tabulatoradskilte data (med udvidelsen .tsv), JSON, Stata og data med fast bredde (.fwf).

Pakker, der er nødvendige til denne vejledning

  • Rio
  • htmltab
  • readxl
  • googlesheets
  • Pacman
  • pedel
  • rmiscutils (pm GitHub) eller readr
  • tibble

Når du har analyseret dine data, hvis du vil gemme resultaterne som et CSV-, Excel-regneark eller andre formater, Rio's eksport() funktion kan klare det.

Hvis du ikke allerede har rio-pakken på dit system, skal du installere den nu med install.packages ("rio").

Jeg har oprettet nogle eksempeldata med vinterens snefaldsdata i Boston. Du kan gå til //bit.ly/BostonSnowfallCSV og højreklikke for at gemme filen som BostonWinterSnowfalls.csv i din nuværende R-projektarbejdskatalog. Men et af pointene med scripting er at erstatte manuelt arbejde - kedeligt eller på anden måde - med automatisering, der er let at gengive. I stedet for at klikke for at downloade kan du bruge R'er download fil funktion med syntaksen download.file ("url", "destinationFileName.csv"):

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

Dette forudsætter, at dit system omdirigerer fra den Bit.ly URL-genvej og med succes finder den rigtige fil-URL, //raw.githubusercontent.com/smach/NICAR15data/master/BostonWinterSnowfalls.csv. Jeg har lejlighedsvis haft problemer med at få adgang til webindhold på gamle Windows-pc'er. Hvis du har en af ​​disse, og dette Bit.ly-link ikke fungerer, kan du bytte den faktiske URL til Bit.ly-linket. En anden mulighed er at opgradere din Windows-pc til Windows 10, hvis det er muligt for at se, om det gør tricket.

Hvis du ønsker, at rio bare kunne importere data direkte fra en URL, kan det faktisk, og jeg kommer til det i næste afsnit. Pointen med det her sektion er at få praksis med at arbejde med en lokal fil.

Når du har testfilen på dit lokale system, kan du indlæse disse data i et R-objekt kaldet snedata med koden:

snedata <- rio :: import ("BostonWinterSnowfalls.csv")

Bemærk, at det er muligt, at rio beder dig om at downloade filen igen i binært format, i hvilket tilfælde du skal køre

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

Sørg for at bruge RStudios indstillinger for fanefuldførelse. Hvis du skriver rio :: og vent, du får en liste over alle tilgængelige funktioner. Type sne og vent, og du skal se det fulde navn på dit objekt som en mulighed. Brug piletasterne op og ned til at skifte mellem forslag til automatisk udfyldelse. Når den ønskede mulighed er fremhævet, skal du trykke på Tab-tasten (eller Enter) for at få det fulde objekt eller funktionsnavn føjet til dit script.

Du skal se objektet snedata vises i fanen miljø i RStudio øverste højre rude. (Hvis den øverste højre rude viser din kommandohistorik i stedet for dit miljø, skal du vælge fanen Miljø.)

Taylor & Francis Group

snedata skal vise, at den har 76 "obs." - observationer eller rækker - og to variabler eller kolonner. Hvis du klikker på pilen til venstre for snedata for at udvide fortegnelsen ser du de to kolonnenavne og typen af ​​data, som hver kolonne indeholder. Det Vinter er karakterstrenge og Total kolonne er numerisk. Du skal også kunne se de første par værdier i hver kolonne i ruden Miljø.

Taylor & Francis Group

Klik på ordet snedata sig selv på fanen Miljø for en mere regnearklignende visning af dine data. Du kan få den samme visning fra R-konsollen med kommandoen Visning (snedata) (det skal være hovedstad V på visningen -udsigt fungerer ikke). Bemærk: snedata er ikke i anførselstegn, fordi du henviser til navnet på et R objekt i dit miljø. 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 uden for R.

Taylor & Francis Group

Denne visning har et par regnearklignende adfærd. Klik på en kolonneoverskrift for at sortere efter kolonnens værdier i stigende rækkefølge. klik på den samme kolonneoverskrift en anden gang for at sortere i faldende rækkefølge. Der er et søgefelt for at finde rækker, der matcher bestemte tegn.

Hvis du klikker på ikonet Filter, får du et filter for hver kolonne. Det Vinter tegnkolonne fungerer, som du kunne forvente, og filtrerer efter eventuelle rækker, der indeholder de tegn, du skriver. Hvis du klikker på i Total i den numeriske søjles filter viser ældre versioner af RStudio dog en skyder, mens nyere viser et histogram og et felt til filtrering.

Importer en fil fra internettet

Hvis du vil downloade og importere en fil fra internettet, kan du gøre det, hvis den er offentligt tilgængelig og i et format som Excel eller CSV. Prøve

snedata <- rio :: import ("// bit.ly/BostonSnowfallCSV", format)

Mange systemer kan følge omdirigerings-URL'en til filen, selv efter først at give dig en fejlmeddelelse, så længe du angiver formatet som "csv" fordi filnavnet her ikke inkluderer .csv. Hvis din ikke fungerer, skal du i stedet bruge URL //raw.githubusercontent.com/smach/R4JournalismBook/master/data/BostonSnowfall.csv.

rio kan også importere velformaterede HTML-tabeller fra websider, men tabellerne skal være ekstremt velformateret. Lad os sige, at du vil downloade tabellen, der beskriver National Weather Service's sværhedsgrad for snestorm. Siden National Centers for Environmental Information Regional Snowfall Index har kun en tabel, meget godt udformet, så kode som denne skal fungere:

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

Bemærk igen, at du skal medtage formatet, i dette tilfælde format = "html" . fordi selve URL'en ikke giver nogen indikation for, hvilken type fil det er. Hvis URL'en indeholdt et filnavn med en .html udvidelse, ville Rio vide.

I det virkelige liv vises webdata sjældent i en så pæn, isoleret form. En god mulighed for sager, der ikke er lige så godt udformede, er ofte htmltab-pakken. Installer det med install.packages ("htmltab"). Pakkens funktion til læsning af en HTML-tabel kaldes også htmltab. Men hvis du kører dette:

bibliotek (htmltab) bytabel <- htmltab ("// da.wikipedia.org/wiki/List_of_United_States_cities_by_population") str (bytabel)

du ser, at du ikke har den rigtige tabel, fordi datarammen indeholder et objekt. Fordi jeg ikke specificerede hvilken tabel trak den den første HTML-tabel på siden. Det var tilfældigvis ikke den, jeg vil have. Jeg har ikke lyst til at importere hver tabel på siden, før jeg finder den rigtige, men heldigvis har jeg en Chrome-udvidelse kaldet Table Capture, der giver mig mulighed for at se en liste over tabellerne på en side.

Sidste gang jeg tjekkede, var tabel 5 med mere end 300 rækker den, jeg ønskede. Hvis det ikke virker for dig nu, kan du prøve at installere Table Capture i en Chrome-browser for at kontrollere, hvilken tabel du vil downloade.

Jeg prøver igen, angiver tabel 5 og ser derefter, hvilke kolonnenavne der er i den nye bytabel. Bemærk, at jeg i følgende kode sætter bytabel <- htmltab () kommando på flere linjer. Det er, så det ikke løb over margenerne - du kan holde alt på en enkelt linje. Hvis tabelnummeret er ændret, siden denne artikel blev offentliggjort, skal du udskifte det hvilken = 5 med det rigtige nummer.

I stedet for at bruge siden på Wikipedia kan du erstatte Wikipedia-URL'en med URL'en til en kopi af den fil, jeg oprettede. Denne fil findes på //bit.ly/WikiCityList. For at bruge denne version skal du skrive bit.ly/WikiCityList ind i en browser, kopier derefter den lange URL, den omdirigerer til, og brug at i stedet for Wikipedia-URL'en i nedenstående kode:

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

Hvordan vidste jeg det hvilken var det argument, jeg havde brug for for at angive tabelnummeret? Jeg læste htmltab hjælp fil ved hjælp af kommandoen ? htmltab. Dette omfattede alle tilgængelige argumenter. Jeg scannede mulighederne og “hvilken en vektor med længde en til identifikation af tabellen i dokumentet ”så rigtigt ud.

Bemærk også, at jeg brugte colnames (bytabel) i stedet for navne (bytabel) for at se kolonnenavnene. Enten fungerer. Base R har ogsånavne () fungere.

Under alle omstændigheder er disse tabelresultater meget bedre, selvom du kan se ved at køre str (bytabel) at et par kolonner, der skulle være tal, kom ind som tegnstrenge. Du kan se dette både ved chr ud for kolonnenavnet og anførselstegn omkring værdier som f.eks 8,550,405.

Dette er en af ​​R's små irritationer: R forstår det generelt ikke 8,550 er et tal. Jeg håndterede dette problem selv ved at skrive min egen funktion i min egen rmiscutils-pakke for at vende alle de "tegnstrenge", der virkelig er tal med kommaer tilbage til tal. Alle kan downloade pakken fra GitHub og bruge den.

Den mest populære måde at installere pakker fra GitHub er at bruge en pakke kaldet devtools. devtools er en ekstremt kraftig pakke designet hovedsagelig til folk, der ønsker at skrive deres egen pakker, og det inkluderer et par måder at installere pakker fra andre steder udover CRAN. Imidlertid kræver devtools normalt et par ekstra trin at installere i forhold til en typisk pakke, og jeg vil efterlade irriterende systemadministratoropgaver, indtil det er absolut nødvendigt.

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

Pacman's p_install_gh ("brugernavn / pakkerepo") funktion installeres fra en GitHub repo.

p_load_gh ("brugernavn / pakkerepo")belastninger en pakke i hukommelsen, hvis den allerede findes på dit system, og den først installeres og derefter indlæser en pakke fra GitHub, hvis pakken ikke findes lokalt.

Min rmisc-hjælpepakke kan findes på smach / rmiscutils. Løb pacman :: p_load_gh ("smach / rmiscutils") for at installere min rmiscutils-pakke.

Bemærk: En alternativ pakke til installation af pakker fra GitHub kaldes fjernbetjeninger, som du kan installere viainstall.packages ("fjernbetjeninger"). Dens hovedformål er at installere pakker fra eksterne lagre som GitHub. Du kan se hjælpefilen med hjælp (pakke = "fjernbetjeninger").

Og muligvis den smukkeste af alt er en pakke kaldet githubinstall. Det sigter mod at gætte repoen, hvor en pakke ligger. Installer det viainstall.packages ("githubinstall"); så kan du installere min rmiscutils-pakke ved hjælp afgithubinstall :: gh_install_packages ("rmiscutils"). Du bliver spurgt, om du vil installere pakken på smach / rmisutils (du gør).

Nu hvor du har installeret min samling af funktioner, kan du bruge min antal_med_kommuner () funktion til at ændre de tegnstrenge, der skal være tal tilbage til tal. Jeg foreslår kraftigt at tilføje en ny kolonne til datarammen i stedet for at ændre en eksisterende kolonne - det er god praksis for dataanalyse, uanset hvilken platform du bruger.

I dette eksempel kalder jeg den nye kolonne PopEst2017. (Hvis tabellen er blevet opdateret siden, skal du bruge passende kolonnenavne.)

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

Min rmiscutils-pakke er forresten ikke den eneste måde at håndtere importerede numre, der har kommaer. Efter at jeg oprettede min rmiscutils-pakke og dens antal_med_kommuner () funktion blev den tidyverse readr-pakke født. readr inkluderer også en funktion, der omdanner tegnstrenge til tal, parse_number ().

Efter installation af readr kan du generere tal fra kolonnen estimat for 2017 med readr:

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

En fordel ved readr :: parse_number () er, at du kan definere din egen landestandard () for at kontrollere ting som kodning og decimaltegn, som kan være af interesse for ikke-USA-baserede læsere. Løb ? parse_number for mere information.

Bemærk: Hvis du ikke brugte fanebladet til kolonnen estimat for 2017, har du muligvis haft et problem med dette kolonnenavn, hvis det har et mellemrum på det tidspunkt, hvor du kører denne kode. I min kode ovenfor skal du bemærke, at der er bagudgående enkelt anførselstegn (`) omkring kolonnenavnet. Det skyldes, at det eksisterende navn havde et mellemrum, som du ikke skulle have i R. Det kolonnenavn har et andet problem: Det starter med et tal, også generelt et R-nr. RStudio ved dette og tilføjer automatisk de nødvendige tilbagebetalinger omkring navnet med fanen autofuldførelse.

Bonustip: Der er en R-pakke (selvfølgelig er der!) Kaldet portner, der automatisk kan rette besværlige kolonnenavne importeret fra en ikke-R-venlig datakilde. Installer det med install.packages ("janitor"). Derefter kan du oprette nye rene kolonnenavne ved hjælp af husholderske rene navne () fungere.

Nu opretter jeg en helt ny dataramme i stedet for at ændre kolonnenavne på min oprindelige dataramme og køre husmands clean_names () på de originale data. Kontroller derefter datarammens kolonnenavne med navne ():

citytable_cleaned <- portner :: clean_names (citytable)

navne (bytabel_renset)

Du ser, at mellemrum er blevet ændret til understregninger, som er lovlige i R-variabelnavne (som perioder). Og alle kolonnenavne, der plejede at starte med et nummer, har nu et x i begyndelsen.

Hvis du ikke ønsker at spilde hukommelse ved at have to kopier af stort set de samme data, kan du fjerne et R-objekt fra din arbejdssession medrm () fungere: rm (bytabel).

Importer data fra pakker

Der er flere pakker, der giver dig adgang til data direkte fra R. One is quantmod, hvilket giver dig mulighed for at trække nogle amerikanske regerings- og økonomiske data direkte ind i R.

En anden er den passende navngivne vejrdata-pakke på CRAN. Det kan hente data fra Weather Underground API, som har information til mange lande rundt om i verden.

Rnoaa-pakken, et projekt fra rOpenSci-gruppen, udnytter flere forskellige US National Oceanic and Atmospheric Administration-datasæt, herunder daglige klima-, bøjnings- og stormoplysninger.

Hvis du er interesseret i data fra staten eller lokale myndigheder i USA eller Canada, kan du tjekke RSocrata for at se, om et bureau, du er interesseret i, lægger data der. Jeg har endnu ikke fundet en komplet liste over alle tilgængelige Socrata-datasæt, men der er en søgeside på //www.opendatanetwork.com. Vær dog forsigtig: Der er community-uploadede sæt sammen med officielle regeringsdata, så tjek ejerne af et datasæt og upload kilde, før du stoler på det for mere end R-praksis. "ODN-datasæt" betyder i et resultat, at det er en fil uploadet af nogen i offentligheden. Officielle regeringsdatasæt har tendens til at leve på webadresser som //data.CityOrStateName.gov og//data.CityOrStateName.us.

For flere dataimportpakker, se mit søgbare diagram på //bit.ly/RDataPkgs. Hvis du arbejder med amerikanske regeringsdata, er du muligvis især interesseret i folketælling og tidycensus, som begge benytter sig af US Census Bureau-data. Andre nyttige regeringsdatapakker inkluderer eu.us.opendata fra regeringerne i USA og EU for at gøre det lettere at sammenligne data i begge regioner og cancensus for canadiske folketællingsdata.

Når dataene ikke er ideelt formateret

I alle disse eksempler på datatilfælde er dataene ikke kun velformaterede, men ideelle: Når jeg først fandt det, var det perfekt struktureret for R. Hvad mener jeg med det? Det var rektangulært, hvor hver celle havde en enkelt værdi i stedet for flettede celler. Og den første række havde kolonneoverskrifter, i modsætning til f.eks. En titelrække med stor skrifttype på tværs af flere celler for at se smukke ud - eller slet ingen kolonneoverskrifter.

Håndtering af rodede data kan desværre blive ret kompliceret. Men der er et par almindelige problemer, der er lette at løse.

Begyndende rækker, der ikke er en del af dataene. Hvis du ved, at de første par rækker i et Excel-regneark ikke har de ønskede data, kan du bede rio om at springe en eller flere linjer over. Syntaksen er rio :: import ("mySpreadsheet.xlsx", spring = 3) for at udelukke de første tre rækker. springe tager et heltal.

Der er ingen kolonnenavne i regnearket. Standardimporten antager, at den første række på dit ark er kolonnenavnene. Hvis dine data gør det ikke har overskrifter, kan den første række af dine data ende som dine kolonneoverskrifter. For at undgå det skal du bruge rio :: import ("mySpreadsheet.xlsx", col_names = FALSE) så R genererer standardoverskrifter på X0, X1, X2 osv. Eller brug en syntaks som f.eks rio :: import ("mySpreadsheet.xlsx", col_names = c ("By", "Stat", "Befolkning")) for at indstille dine egne kolonnenavne.

Hvis der er flere faner i dit regneark, vises hvilken argument tilsidesætter standardlæsningen i det første regneark. rio :: import ("mySpreadsheet.xlsx", hvilket = 2) læses i det andet regneark.

Hvad er en dataramme? Og hvad kan du gøre med en?

rio importerer et regneark eller en CSV-fil som en R dataramme. Hvordan ved du, om du har en dataramme? I tilfælde af snedata, klasse (snedata) returnerer den klasse eller type objekt, det er. str (snedata) fortæller dig også klassen og tilføjer lidt mere information. Meget af den information, du ser med str () svarer til hvad du så for dette eksempel i RStudio-miljøruden: snedata har 76 observationer (rækker) og to variabler (kolonner).

Datarammer ligner noget regneark, idet de har kolonner og rækker. Datarammer er dog mere strukturerede. Hver kolonne i en dataramme er en R vektor, hvilket betyder at hvert element i en kolonne skal være den samme datatype. En kolonne kan være alle tal og en anden kolonne kan være alle strenge, men inden for en kolonne skal dataene være ensartede.

Hvis du har en datarammekolonne med værdierne 5, 7, 4 og "den kommende værdi", vil R ikke bare være utilfreds og give dig en fejl. I stedet tvinger det alle dine værdier til at være den samme datatype. Fordi "den kommende værdi" ikke kan omdannes til et tal, vil 5, 7 og 4 ende med at blive omdannet til tegnstrenge på "5", "7"og "4". Dette er normalt ikke det, du ønsker, så det er vigtigt at være opmærksom på, hvilken type data der er i hver kolonne. En afvigende tegnstrengværdi i en kolonne på 1.000 numre kan gøre det hele til tegn. Hvis du vil have tal, skal du sørge for at have dem!

R har måder at henvise til manglende data, der ikke skruer resten af ​​dine kolonner op: NA betyder "ikke tilgængelig."

Datarammer er rektangulære: Hver række skal have det samme antal poster (selvom nogle kan være tomme), og hver kolonne skal have det samme antal poster.

Excel-regnearkkolonner henvises typisk til med bogstaver: Kolonne A, Kolonne B osv. Du kan henvise til en datarammekolonne med dens navn ved hjælp af syntaksen dataFrameName $ columnName. Så hvis du skriver snedata $ I alt og tryk på Enter, du ser alle værdier i Total som vist i figuren nedenfor. (Det er derfor, når du kører str (snedata) kommando, der er et dollartegn foran navnet på hver kolonne.)

Taylor & Francis Group

En påmindelse om, at disse parentestal til venstre for listen ikke er en del af dataene; de fortæller dig bare, hvilken position hver datalinje starter med. [1] betyder, at linjen starter med det første element i vektoren, [10] den tiende osv.

Fuldførelse af fanen RStudio fungerer med datarammekolonnenavne samt objekt- og funktionsnavne. Dette er ret nyttigt for at sikre, at du ikke stave forkert et kolonnenavn og bryde dit script - og det gemmer også indtastning, hvis du har lange kolonnenavne.

Type snedata $ og vent, så ser du en liste over alle kolonnenavne i snedata.

Det er let at tilføje en kolonne til en dataramme. I øjeblikket er Total kolonne viser vinter snefald i inches. For at tilføje en kolonne, der viser totaler i meter, kan du bruge dette format:

snedata $ meter <- snedata $ I alt * 0,0254

Navnet på den nye kolonne er til venstre, og der er en formel til højre. I Excel har du muligvis brugt = A2 * 0,0254 og kopierede derefter formlen ned i kolonnen. Med et script behøver du ikke bekymre dig om, hvorvidt du har anvendt formlen korrekt på alle værdierne i kolonnen.

Se nu på din snedata objekt under fanen Miljø. Den skal have en tredje variabel, Meter.

Fordi snedata er en dataramme, den har visse datarammeegenskaber, som du kan få adgang til fra kommandolinjen. nrow (snedata) giver dig antallet af rækker og ncol (snedata) antallet af kolonner. Ja, du kan se dette i RStudio-miljøet for at se, hvor mange observationer og variabler der er, men der vil sandsynligvis være tidspunkter, hvor du vil vide dette som en del af et script. colnames (snedata) eller navne (snedata) giver dig navnet på snedata kolonner. kaldenavne (snedata) give dig eventuelle rækkenavne (hvis ingen var indstillet, vil det som standard være tegnstrenge i række nummer som f.eks "1", "2", "3", etc.).

Nogle af disse specielle dataframe-funktioner, også kendt som metoder, ikke kun giver dig information, men lader dig ændre karakteristika for datarammen. Så, navne (snedata) fortæller dig kolonnenavnene i datarammen, men

navne (snedata) <- c ("Winter", "SnowInches", "SnowMeters")

ændringer kolonnenavnene i datarammen.

Du behøver sandsynligvis ikke kende alle tilgængelige metoder til et datarammeobjekt, men hvis du er nysgerrig, metoder (klasse = klasse (snedata)) viser dem. For at finde ud af mere om en hvilken som helst metode skal du køre den sædvanlige hjælpeforespørgsel med et spørgsmålstegn, f.eks ?fusionere eller ? delmængde.

Når et nummer ikke rigtig er et tal

Postnumre er et godt eksempel på "tal", der ikke rigtig bør behandles som sådan. Selvom det er teknisk numerisk, giver det ikke mening at gøre ting som at tilføje to postnumre sammen eller tage et gennemsnit af postnumre i et fællesskab. Hvis du importerer en postnummerkolonne, vil R sandsynligvis gøre det til en kolonne med tal. Og hvis du har at gøre med områder i New England, hvor postnumre starter med 0, forsvinder 0.

Jeg har en tabuleret fil med Boston-postnumre efter kvarter, downloadet fra et regeringsagentur i Massachusetts på //raw.githubusercontent.com/smach/R4JournalismBook/master/data/bostonzips.txt. Hvis jeg prøvede at importere det med lynlåse <- rio :: import ("bostonzips.txt")ville postnumrene komme ind som 2118, 2119 osv. og ikke 02118, 02119 osv.

Det er her, det hjælper at vide lidt om den underliggende funktion, som rio er importere() funktion bruger. Du kan finde disse underliggende funktioner ved at læse importere hjælp fil på ?importere. For at trække i tabulatoradskilte filer, importere bruger enten fread () fra data.table-pakken eller base R'er read.table () fungere. Det ? læse.tabel hjælp siger, at du kan angive kolonneklasser med colClasses argument.

Opret en underundersøgelse i din aktuelle projektmappe, og download derefter filen bostonzips.txt med

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

Hvis du importerer denne fil, der angiver begge kolonner som tegnstrenge, kommer postnumrene korrekt formuleret:

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

Bemærk, at søjleklasserne skal indstilles ved hjælp af c () fungere, c ("tegn", "tegn"). Hvis du prøvede colClasses, "karakter", får du en fejlmeddelelse. Dette er en typisk fejl for R-begyndere, men det bør ikke tage lang tid at komme ind i c () vane.

Et tip til at gemme dig selv-skrive: Skriv ud c ("tegn", "tegn") er ikke så besværlig; men hvis du har et regneark med 16 kolonner, hvor de første 14 skal være tegnstrenge, kan dette blive irriterende. R'er rep () funktion kan hjælpe. rep (), som du måske har gættet, gentager det, du giver det, men hvor mange gange du fortæller det til ved hjælp af formatet rep (myitem, numtimes). rep ("karakter", 2) er det samme som c ("tegn", "tegn"), så colClasses = rep ("tegn", 2) svarer til colClasses = c ("tegn", "tegn") . Og, colClasses = c (rep ("tegn", 14), rep ("numerisk", 2)) indstiller de første 14 kolonner som tegnstrenge og de sidste to som tal. Alle navnene på kolonneklasser her skal være i anførselstegn, fordi navne er tegnstrenge.

Jeg foreslår, at du leger lidt med rep () så du vænner dig til formatet, da det også er en syntaks, som andre R-funktioner bruger.

Nemme eksempeldata

R leveres med nogle indbyggede datasæt, der er nemme at bruge, hvis du vil lege med nye funktioner eller andre programmeringsteknikker. De bruges også meget af folk, der underviser i R, da instruktører kan være sikre på, at alle studerende starter med de samme data i nøjagtigt det samme format.

Type data() for at se tilgængelige indbyggede datasæt i base R og de installerede pakker, der aktuelt er indlæst. data (pakke = .pakker (alt.tilgængeligt = SAND)) fra base R viser alle mulige datasæt fra pakker, der er installeret i dit system, uanset om de er indlæst i hukommelsen eller ej i din nuværende arbejdssession.

Du kan få flere oplysninger om et datasæt på samme måde som du får hjælp til funktioner: ? datasætnavn eller hjælp ("datasætnavn"). mtcars og iris er blandt dem, jeg har set brugt meget ofte.

Hvis du skriver mtcars, hele mtcars-datasættet udskrives i din konsol. Du kan bruge hoved() funktion til at se på de første par rækker med hoved (mtcars).

Du kan gemme datasættet i en anden variabel, hvis du vil, med et format som cardata <- mtcars.

Eller kører datafunktionen med datasættets navn, f.eks data (mtcars), indlæser datasættet i dit arbejdsmiljø.

En af de mest interessante pakker med eksempeldatasæt til journalister er fivethirtyeight-pakken, som indeholder data fra historier offentliggjort på FiveThirtyEight.com-webstedet. Pakken blev oprettet af flere akademikere i samråd med FiveThirtyEight-redaktører; det er designet til at være en ressource til undervisning i bachelorstatistikker.

Færdigpakket data kan være nyttigt - og i nogle tilfælde sjovt. I den virkelige verden bruger du dog muligvis ikke data, der er så bekvemt pakket.

Opret en dataramme manuelt i R

Chancerne er, at du ofte beskæftiger dig med data, der starter uden for R, og du importerer fra et regneark, CSV-fil, API eller anden kilde. Men nogle gange vil du måske bare skrive en lille mængde data direkte i R eller på anden måde oprette en dataramme manuelt. Så lad os se hurtigt på, hvordan det fungerer.

R-datarammer er samlet kolonne for kolonne som standard, ikke en række på et tidspunkt. Hvis du vil samle en hurtig dataramme over byvalgresultater, kan du oprette en vektor med kandidatnavne, en anden vektor med deres partitilhørighed og derefter en vektor af deres samlede stemmer:

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

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

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

Husk ikke at bruge kommaer i dine tal, som du måske gør i Excel.

For at oprette en dataramme ud fra disse kolonner skal du bruge data.frame () funktion og synatx data.frame (kolonne1, kolonne2, kolonne3).

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

Tjek dens struktur med str ():

str (myresults)

Mens kandidaterne og partiet vektorer er tegn, kandidaterne og partiet datarammekolonner er blevet omdannet til en klasse af R-objekter kaldet faktorer. Det er lidt for ukrudt på dette tidspunkt til at dykke ned i, hvordan faktorer er forskellige fra tegn, bortset fra at sige det

  1. Faktorer kan være nyttige, hvis du vil bestille varer på en bestemt, ikke-alfabetisk måde til tegning og andre formål, f.eks. Fattige er mindre end Retfærdig er mindre end godt er mindre end Fremragende.
  2. Faktorer kan opføre sig anderledes, end du til tider kunne forvente. Jeg anbefaler at holde fast i karakterstrenge, medmindre du har en god grund til specifikt at ønske faktorer.

Du kan holde dine karakterstrenge intakte, når du opretter datarammer ved at tilføje argumentet stringsAsFactors = FALSE:

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

Nu er værdierne, hvad du forventede.

Der er en ting mere, jeg skal advare dig om, når jeg opretter datarammer på denne måde: Hvis en kolonne er kortere end den / de andre, gentager R undertiden data fra den kortere kolonne -om du ønsker, at det skal ske.

Sig, for eksempel, du oprettede valgresultatkolonnerne for kandidater og parti, men indtastede kun stemmeresultater for Smith og Jones, ikke for Write-ins og Blanks. Du kan forvente, at datarammen viser de to andre poster som tomme, men du tager fejl. Prøv det og se ved at oprette en ny stemmevektor med kun to tal og bruge den nye stemmevektor til at oprette en anden dataramme:

stemmer <- c (15248, 16723)

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

str (myresults2)

Det er rigtigt, R genbrugte de to første numre, hvilket bestemt er ikke hvad du vil have. Hvis du prøver dette med tre tal i afstemningsvektoren i stedet for to eller fire, ville R kaste en fejl. Det skyldes, at hver post ikke kunne genbruges det samme antal gange.

Hvis du nu tænker, ”Hvorfor kan jeg ikke oprette datarammer, der ikke automatisk ændrer strenge til faktorer? Og hvorfor skal jeg bekymre mig om, at datarammer genbruger en søjles data, hvis jeg glemmer at udfylde alle dataene? " Hadley Wickham havde den samme tanke. Hans tibble-pakke skaber en R-klasse, også kaldet tibble, som han siger er en ”moderne tilgang til datarammer. De holder de funktioner, der har stået tidstesten, og dropper de funktioner, der plejede at være praktiske, men nu frustrerende. ”

Hvis dette appellerer til dig, skal du installere tibble-pakken, hvis den ikke findes på dit system, og derefter prøve at oprette en tibble med

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

og du får en fejlmeddelelse om, at stemmekolonnen skal være enten fire eller fire varer lang (tibble () gentager et enkelt emne så mange gange som nødvendigt, men kun for et emne).

Sæt stemmekolonnen tilbage til fire poster, hvis du vil oprette en tibble med disse data:

bibliotek (tibble)

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

myresults3 <- tibble (kandidater, parti, stemmer)

str (myresults3)

Det ligner en dataramme - faktisk det er en dataramme, men med nogle specielle adfærd, såsom hvordan den udskrives. Bemærk også, at kandidatkolonnen er karakterstrenge, ikke faktorer.

Hvis du kan lide denne opførsel, skal du fortsætte og bruge småfiner. I betragtning af hvordan fremherskende konventionelle datarammer forbliver i R, er det stadig vigtigt at vide om deres standardadfærd.

Eksport af data

Når du har slået dine data i R, vil du ofte gemme dine resultater. Her er nogle af måderne til at eksportere dine data, som jeg plejer at bruge mest:

Gem 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, baseret på filtypenavnet. Der er flere andre tilgængelige formater, herunder .tsv til tabulatoradskilte data, .json til JSON og .xml til XML.

Gem til et R-binært objekt det gør det let at indlæse tilbage i R i fremtidige sessioner. Der er to muligheder.

Generisk Gemme() gemmer et eller flere objekter i en fil, f.eks gem (objectName1, objectName2, file = "myfilename.RData"). For at læse disse data tilbage i R, skal du bare bruge kommandoen load ("myfilename.RData") og alle objekterne vender tilbage med de samme navne i samme tilstand som de havde før.

Du kan også gemme et enkelt objekt i en fil med saveRDS (myobject, file = "filnavn.rds"). Den logiske antagelse er, at loadRDS læser filen tilbage, men i stedet er kommandoen readRDS—Og i dette tilfælde er bare dataene gemt, ikke objektnavnet. Så du skal læse dataene i et nyt objektnavn, f.eks mydata <- readRDS ("filnavn.rds").

Der er en tredje måde at gemme et R-objekt specifikt til R på: generere R-kommandoerne, der genskaber objektet i stedet for objektet med endelige resultater. Basis R-funktionerne til at generere en R-fil til at genskabe et objekt er dput () eller dump (). Dog finder jeg rio :: eksport (myobject, "mysavedfile.R") endnu lettere at huske.

Endelig er der yderligere måder at gemme filer, der optimerer til læsbarhed, hastighed eller komprimering, som jeg nævner i afsnittet om yderligere ressourcer i slutningen af ​​denne artikel.

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

Bonus: Rio's konvertere() Med funktionen kan du - du gættede det - konvertere en filtype til en anden uden at skulle trække dataene manuelt ind og derefter ud af R. Se ?konvertere for mere info.

Sidste punkt: RStudio lader dig klikke for at importere en fil uden at skulle skrive kode overhovedet. Dette er ikke noget, jeg anbefaler, før du er fortrolig med at importere fra kommandolinjen, for jeg synes det er vigtigt at forstå koden bag import. Men jeg indrømmer, at dette kan være en praktisk genvej.

Gå til fanen Filer i RStudios nederste højre rude, naviger til den fil, du vil importere, og klik på den. Du får vist en mulighed for enten at se fil eller importere datasæt. Vælg Importer datasæt for at se en dialogboks, der viser eksempler på dataene, giver dig mulighed for at ændre, hvordan dataene importeres, og få vist den kode, der genereres.

Foretag de ændringer, du ønsker, og klik på Importer, så bliver dine data trukket ind i R.

Yderligere ressourcer

Rio alternativer. Mens Rio er en stor schweizisk hærkniv til filhåndtering, kan der være tidspunkter, hvor du vil have lidt mere kontrol over, hvordan dine data trækkes ind i eller gemmes ud af R. Derudover har der været tidspunkter, hvor jeg har haft en udfordrende datafil, som rio kvalt, men en anden pakke kunne klare det. Nogle andre funktioner og pakker, du måske vil udforske:

  • Base R'er read.csv () og read.table () for at importere tekstfiler (brug ? read.csv og ? læse.tabel for at få mere information). stringsAsFactors = FALSE er nødvendigt med disse, hvis du vil beholde dine karakterstrenge som karakterstrenge. skriv.csv () gemmer i CSV.
  • rio bruger Hadley Wickhams readxl-pakke til læsning af Excel-filer. Et andet alternativ til Excel er openxlsx, som kan skrive til en Excel-fil såvel som at læse en. Se på openxlsx-pakkevignetterne for oplysninger om formatering af dine regneark, når du eksporterer.
  • Wickhams readr-pakke er også værd at se som en del af "tidyverse". readr inkluderer funktioner til at læse CSV, tabulatoradskilt, fast bredde, weblogfiler og flere andre typer filer. readr udskriver den datatype, den har bestemt for hver kolonne - heltal, tegn, dobbelt (ikke-heltal) osv. Det skaber klodser.

Importer direkte fra et Google-regneark. Googlesheets-pakken giver dig mulighed for at importere data fra et Google Sheets-regneark, selvom det er privat, ved at godkende din Google-konto. Pakken er tilgængelig på CRAN; installer det viainstall.packages ("googlesheets"). Efter ilægning med bibliotek ("googlesheets"), læs den fremragende indledende vignet. På tidspunktet for denne skrivning var introvignetten tilgængelig i R kl vignet ("grundlæggende brug", pakke = "googlesheets"). Hvis du ikke kan se det, så prøv hjælp (pakke = "googlesheets") og klik på linket User Guides, Package Vignettes og Other Documentation for tilgængelige vignetter, eller se pakkeoplysningerne på GitHub på //github.com/jennybc/googlesheets.

Skrab data fra websider med rvest-pakken og SelectorGadget-browserudvidelse eller JavaScript-bogmærke. SelectorGadget hjælper dig med at finde de CSS-elementer af data, du vil kopiere, og som er på en HTML-side; derefter bruger rvest R til at finde og gemme disse data. Dette er ikke en teknik for rå begyndere, men når du har lidt R-oplevelse under dit bælte, vil du måske komme tilbage og besøge dette igen. Jeg har nogle instruktioner og en video om, hvordan man gør dette på //bit.ly/Rscraping. RStudio har også et webinar tilgængeligt efter behov.

Alternativer til at basere R's gemme- og læse-funktioner. Hvis du arbejder med store datasæt, kan hastighed blive vigtig for dig, når du gemmer og indlæser filer. Data.table-pakken har en hurtig fread () funktion, men pas på, at resulterende objekter er data.tables og ikke almindelige datarammer; nogle adfærd er forskellige. Hvis du vil have en konventionel dataramme, kan du få en med as.data.frame (mydatatable) syntaks. Data.table-pakken skriv () funktionen er rettet mod at skrive til en CSV-fil betydeligt hurtigere end base R'er skriv.csv ().

To andre pakker kan være af interesse for lagring og hentning af data. Fjerpakken gemmes i et binært format, der kan læses enten i R eller Python. Og den første pakke read.fst () og skriv.fst () tilbyder hurtig gemning og indlæsning af R-datarammeobjekter - plus mulighed for filkomprimering.