../_images/logo_R.png

R Snabbstart

R är en fri mjukvarumiljö för statistiska beräkningar och grafik.

Denna snabbstart beskriver hur du gör:

  • använda R för enkel aritmetik

  • ladda data från en shapefil och kartlägga den

  • göra en koordinattransformation

  • plotta några datapunkter på en karta

Starta R

R är i huvudsak ett kommandoradsprogram, även om grafiska användargränssnitt finns tillgängliga. Du skriver en kodrad vid prompten, trycker på retur, och R-tolken utvärderar den och skriver ut resultatet.

Tips

Var inte rädd för kommandoraden - den är en källa till stor kraft. Använd upp- och nedpilarna för att återkalla kommandon så att du kan redigera misstag. Tryck på CTRL-C om du fastnar och du bör få tillbaka prompten.

Välj Geospatial ‣ Spatial Tools ‣ R Statistics. Ett terminalfönster öppnas där R körs.

Du kan börja med enkel aritmetik.

> 3*2
[1] 6

> 1 + 2 * 3 / 4
[1] 2.5

> sqrt(2)
[1] 1.414214

> pi * exp(-1)
[1] 1.155727

Ett komplett utbud av aritmetiska, trigonometriska och statistiska funktioner är inbyggda och tusentals fler finns tillgängliga från paket i arkivet CRAN.

Huvudprompten i R är >, men det finns också en fortsättningsprompt +, som visas om R förväntar sig mer inmatning för att skapa ett giltigt uttryck. Du ser det här om du glömmer en avslutande parentes eller klammer.

> sqrt(
+ 2
+ )
[1] 1.414214

Byggnadsdata

Du kanske undrar vad det mystiska ”ett” inom hakparentes gör i utmatningen. Detta talar om för dig att resultatet är ett tal. R kan lagra saker i endimensionella vektorer, tvådimensionella matriser och flerdimensionella matriser. Det finns många funktioner som kan generera dessa saker. Här är en enkel sekvens:

> seq(1, 5, len=10)
[1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667 4.111111
[9] 4.555556 5.000000

Nu kan du se att [9] talar om för oss att 4,555 är det nionde värdet i vektorn.

Om du konstruerar en matris får du rad- och kolumnbeteckningar:

> m = matrix(1:12, 3, 4)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

Element i matriser kan extraheras med hjälp av hakparenteser, med rad- och kolumnindex åtskilda med kommatecken. Lämna ett index tomt för att få en hel rad som en vektor. Använd ett vektorindex för att få flera rader eller kolumner som en mindre matris:

> m[2,4]
[1] 11

> m[2,]
[1]  2  5  8 11

> m[,3:4]
     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

Dataramar är datastrukturer som speglar den typ av struktur som finns i en RDBMS som Postgres eller MySQL. Varje rad kan betraktas som en post, medan kolumnerna är som fält i en databas. Precis som i en databas måste varje fält vara av samma typ för varje post.

På många sätt fungerar de som matriser, men du kan också få och ställa in kolumnerna med namn med hjälp av $-notation:

> d = data.frame(x=1:10, y=1:10, z=runif(10)) # z is 10 random numbers
> d
        x  y          z
    1   1  1 0.44128080
    2   2  2 0.09394331
    3   3  3 0.51097462
    4   4  4 0.82683828
    5   5  5 0.21826740
    6   6  6 0.65600533
    7   7  7 0.59798278
    8   8  8 0.19003625
    9   9  9 0.24004866
    10 10 10 0.35972749

> d$z
 [1] 0.44128080 0.09394331 0.51097462 0.82683828 0.21826740 0.65600533
 [7] 0.59798278 0.19003625 0.24004866 0.35972749

> d$big = d$z > 0.6  # d$big is now a boolean true/false value
> d[1:5,]
  x y          z   big
1 1 1 0.44128080 FALSE
2 2 2 0.09394331 FALSE
3 3 3 0.51097462 FALSE
4 4 4 0.82683828  TRUE
5 5 5 0.21826740 FALSE

> d$name = letters[1:10] # create a new field of characters
> d[1:5,]
  x y          z   big name
  1 1 1 0.44128080 FALSE    a
  2 2 2 0.09394331 FALSE    b
  3 3 3 0.51097462 FALSE    c
  4 4 4 0.82683828  TRUE    d
  5 5 5 0.21826740 FALSE    e

Ladda kartdata

Det finns många paket för hantering av spatiala data och statistik. Vissa finns med här och andra kan laddas ner från CRAN.

Här kommer vi att ladda två shapefiler - landsgränser och befolkade platser från Natural Earth-data. Vi använder två tilläggspaket för att få den spatiala funktionaliteten:

> library(sf)           # Simple Features manipulation Library
> library(ggplot2)      # Plotting library

> countries <- st_read(dsn = "~/data/natural_earth2/ne_10m_admin_0_countries.shp")
> places <- st_read(dsn = "~/data/natural_earth2/ne_10m_populated_places.shp")
> ggplot(countries) + geom_sf()

Detta ger oss en enkel karta över världen:

../_images/r_plot1.png

När en OGR-datauppsättning läses in i R på det här sättet får vi tillbaka ett objekt som på många sätt beter sig som en dataram. Vi kan använda fältet admin för att dela upp världsdata och bara få Storbritannien:

> uk <- countries[countries$admin == 'United Kingdom',]
> ggplot(uk) + geom_sf()
../_images/r_plot2.png

Det här ser lite knasigt ut för alla som bor här, eftersom vi är mer bekanta med ett koordinatsystem som är centrerat kring vår latitud. För närvarande har objektet inte tilldelats något koordinatsystem.

Vi måste tilldela objektet en CRS innan vi kan transformera det med funktionen sf::st_transform från sf-paketet. Vi transformerar till EPSG:27700 som är Ordnance Survey of Great Britain grid system:

> ukos <- st_transform(uk,27700)
> ggplot(ukos) + geom_sf()
../_images/r_plot2_1.png

Detta plottar baskartan för de transformerade uppgifterna. Nu vill vi lägga till några punkter från datauppsättningen med befolkade platser. Återigen väljer vi ut de punkter vi vill ha och omvandlar dem till koordinater för Ordnance Survey Grid Reference:

> ukpop <- places[places$SOV0NAME == 'United Kingdom',]
> ukpop <- st_transform(ukpop,27700)

Vi lägger till dessa punkter på baskartan, skalar deras storlek med den skalade kvadratroten av befolkningen (eftersom det ger en symbol med en yta som är proportionell mot befolkningen), ställer in färgen på röd och plottningskaraktären på en solid klump:

> ggplot() +
>   geom_sf(data = ukos) +                                                          # add UK shape to the map
>   geom_sf(data = ukpop,                                                           # add the Populated places
>           aes(size = ukpop$POP_MAX/100000),                       # fix size of points (by area)
>           colour = 'red', alpha = 1/5) +                          # set points colour and transparency
>   coord_sf(crs = 27700, datum= sf::st_crs(27700),         # set a bounding box
>            xlim = st_bbox(ukos[c(1,3)]),                          # for the map
>            ylim = st_bbox(ukos[c(2,4)])
>           ) +
>   ggtitle('Uk Population centre sizes') +                         # set the map title
>       theme(legend.position = 'bottom') +                         # Legend position
>           scale_size_area(name = 'Population \nin 100K')  # 0 value means 0 area + legend title

och vår slutliga bild visas:

../_images/r_plot3.png

Tips

Avsluta R genom att skriva q() och trycka på returtangenten. R kommer att fråga dig om du vill spara din arbetsyta som en R data image-fil. När du startar R igen från en katalog med filen .RData återställer den alla data därifrån.

Vinjetter

Tidigare tenderade dokumentationen för R-paket att vara kortfattat skrivna hjälpsidor för varje funktion. Nu uppmuntras paketförfattare att skriva en ”vignette” som en vänlig introduktion till paketet. Om du kör funktionen vignette() utan argument får du en lista över de vinjetter som finns i ditt system. Prova vignette("sf1") för en något teknisk introduktion till R spatial-paketet.

Hur vill du gå vidare?

För allmän information om R, prova den officiella Introduction to R eller någon av dokumentationerna från huvudsidan för R Project.

För mer information om spatiala aspekter av R är det bästa stället att börja förmodligen R Spatial Task View

You might also want to check out the R-Spatial and RSpatial pages.