R (język programowania)

Ta strona jest wstępem do programowania w R , czyli języku programowania i środowisku do obliczeń statystycznych i wizualizacji wyników.[1]

R-Logo

Poniższe przykłady pokazują pracę w konsoli.

Instalacja

edytuj

Ubuntu

edytuj
sudo apt install r-base r-base-dev -y

lub

sudo apt install r-cran-littler


Wprowadzenie

edytuj

Przykładowa sesja

edytuj

Rozpoczęcie pracy z konsoli :

R

zakończenie pracy :


q()

co jest skrótem od :

quit()


Możemy od razu odpowiedzieć na pytanie czy chcemy zachować sesję

quit(save="n")


lub

q(save="n")


Edycja

edytuj

domyślny edytor tekstowy w konsoli

edytuj

Sprawdzamy jakie jest domyślne ustawienie :

getOption('editor')

przykładowy wynik :

[1] "vi"

czyli w tym przypadki Vim, aby wyjść z Vima wprowadź

:q


Uruchomiamy domyślny edytor tekstowy :

edit()


lub

fix()

albo jednoznacznie :

vi(name = NULL, file = "") 
emacs(name = NULL, file = "") 
pico(name = NULL, file = "") 
xemacs(name = NULL, file = "") 
xedit(name = NULL, file = "")

Inne edytory

edytuj
  • RStudio
  • Tinn-R
  • RGedit
  • Emacs with ESS (“Emacs Speaks Statistics”)
  • RGui

typy danych

edytuj
 
dane ucięte

Funkcje

edytuj

Funkcje :

  • data
  • head
  • names
  • dim
  • attach i detach

Źródła danych

edytuj

Dane wewnętrzny R

edytuj

Pakiet R zawiera przykładowe zbiory danych.

Wyświetlamy listę dostępnych zbiorów danych :

data()

oraz listę zbiorów zawartych we wszystkich dostępnych bibliotekach :

data(package = .packages(all.available = TRUE))

Dane są zawarte w pakiecie survival. Z uwagi na użycie lazyData[2]

nie wczytujemy ich za pomocą data tylko :

aml

Wybieramy zbiór cats z pakietu MASS ( ładujemy pakiet i wczytujemy zbiór ) :

library(MASS)
data(cats)

Sprawdzamy nagłówki :

> names(cats)
[1] "Sex" "Bwt" "Hwt"

Podsumowanie :

 > summary(cats)
 Sex         Bwt             Hwt       
 F:47   Min.   :2.000   Min.   : 6.30  
 M:97   1st Qu.:2.300   1st Qu.: 8.95  
        Median :2.700   Median :10.10  
        Mean   :2.724   Mean   :10.63  
        3rd Qu.:3.025   3rd Qu.:12.12  
        Max.   :3.900   Max.   :20.50

mtcars

edytuj

Często używany zbiór danych mtcars znajduje się w bibliotece datasets. Nie zawsze jest ona domyślnie ładowana. Wtedy ładujemy bibliotekę :

library(datasets)

i wczytujemy zbiór mtcars :

data(mtcars)

i już możemy go używać. Jeśli chcemy używać nagłówków bez nazwy zbioru danych  :

attach(mtcars)

Funkcji attach() należy jednak używać ostrożnie, ponieważ R w pierwszej kolejności szuka zmiennych w przestrzeni nazw stworzonej poleceniem attach. Gdy chcemy odłączyć dostęp do nazw zmiennych w danym zbiorze stosujemy polecenie detach(). W tym przypadku :

detach(mtcars)


volcano

edytuj

Informacje topograficzne dotyczące wulkanu Maunga Whau w Auckland: zestaw danych podaje wysokość wulkanu w siatce o wymiarach 10 x 10 metrów.[3] Ten zbiór to macierz z 61 kolumnami i 87 wierszami, w której przechowywane są liczby podwójnej precyzji ( ang. doubles)

Dane w plikach

edytuj

Dane z plików wczytujemy i zapisujemy do zmiennych. Typ zmiennej zależy od struktury danych. Najłatwiejsze jest wczytywanie danych z plików tekstowych, jak csv. Jest to stosowany przy małej i średniej ilości danych. Przy dużej ilości danych szybsze i objętościowo mniejsze będą pliki binarne. [4]

Katalogi

edytuj

Najpierw sprawdźmy jaki jest aktualny katalog roboczy :

getwd()

Katalog roboczy możemy zmienić na inny za pomocą :

setwd("nazwa_katalogu")


Potem sprawdźmy jakie są tam pliki :

list.files()
Pliki binarne
edytuj
Pliki tekstowe
edytuj

Pliku csv[5] jest plikiem tekstowym.


Tworzenie :

Ręczne


Tworzymy wektor, wyświetlamy go i zapisujemy do pliku :

> wektor=c(1:30)
> wektor
[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30
> cat(wektor, file = "w.csv",append=F, sep=",")



Tworzymy macierz, wyświetlamy ją i zapisujemy do pliku :

> macierz=matrix(1:6,2,3)
> macierz
[,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> write.table(macierz,file="m.csv", sep=",")


Tworzymy ramkę danych i zapisujemy ją do pliku

> v1 = 1:5
> v2 = c(T,T,F,F,T)
> df = data.frame(v1,v2)
> write.csv(df, file="df.csv")


> df = data.frame(foo=1:5,bar=c(T,T,F,F,T))
> write.csv(df, file="df.csv")


MySQL MySQL pozwala eksportować tabele do pliku csv

W edytorze tekstów

Plik csv możemy utworzyć w każdym edytorze tekstów. Zapisujemy go jak o plik tekstowy z rozszerzeniem csv i przecinkiem jako znakiem rozdzielającym pola.

Konwersja Plik :

  • baz danych, np. Accessa z rozszerzeniem mdb
  • arkuszy kalkulacyjnych, np. Excela[6]

możemy przekształcić na format csv.

W Accesie i Excelu po utworzeniu bazy danych lub arkusza wybieramy opcję eksportuj do pliku tekstowego. Możemy :

  • zmienić znak oddzielający pola ( w polskiej wersji jest średnika a angielskiej przecinek )
  • wstawić do pliku nagłówki.

Plik csv z przecinkami nie wczytamy ponownie do Accessa ( błąd), dlatego bezpieczniej jest używać pliku ze średnikiem jako znakiem oddzielającym pola

Otwieranie

Plik lokalny Sposób otwarcia pliku zależy od jego zawartości.

Pliku csv może zawierać dane :

  • tego samego typu ułożone w formie tabeli, co w R nazywane jest macierzą ( ang. table)
  • różnego typu ułożone w formie tabeli, co w R nazywane jest ramką danych ( ang. data frame)

W pakiecie base jest funkcja do otwarcia pliku csv zawierającego macierz :

read.table("nazwa_pliku") 


W pakiecie utils jest funkcja do otwarcia pliku csv zawierającego ramkę danych z przecinkiem:

read.csv("nazwa_pliku") 

i średnikiem jako znakiem oddzielającym pola :

read.csv2("nazwa_pliku") 


Przykłady użycia :

macierz = read.table("m.csv")
ramka = read.csv("r.csv")

Plik na innym komputerze

Przemysław Biecek [7] udostępnia pliki przykładowymi danymi. Wybieramy plik daneSoc.csv, wczytujemy i zapisujemy do zmiennej ramka :

ramka = read.csv("http://www.biecek.pl/R/dane/daneSoc.csv", sep=";")

Wyświetlamy zawartość zmiennej :

ramka

Inne źródła danych :

Dane tworzone przez użytkownika

edytuj
> macierz=matrix(1:6,2,3)
> macierz
[,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Eksport danych

edytuj

Zapis danych do pliku csv

t=table(a$ROK_WYPISU,a$ICD9CM);
t;
write.table(t,"t.csv", quote = FALSE, sep = ";");

Przygotowanie danych do analizy

edytuj

Obiekty

edytuj

Sprawdzamy objekty :

objects()

przykłądowy wynik :

character(0)

Typ obiektu

edytuj

Sprawdzamy jakiego typu jest zbiór :

> class(cats)
[1] "data.frame"

Jest to ważne ponieważ funkcje odpowiednie dla ramki danych nie muszą być odpowiednie dla macierzy i odwrotnie.[8]

Istnieją funkcje, które można wykonać na obiektach dowolnego typu :[9]

  • fix(obiekt)
  • class(obiekt)
  • unclass(obiekt)
  • typeof(obiekt)
  • mode(obiekt)
  • attributes(obiekt)



Przydatne funkcje :

  • names() podaje nazwę zmiennej
  • class() podaje typ zmiennej
  • str() pokazuje strukturę zbioru danych
  • summary() podaje średnią,
  • describe() z pakietu Hmisc podaje więcej szczegółów niż summary()
  • contents() z pakietu Hmisc
  • dims() z pakietu Zelig
  • descr() z pakietu descr daje :
    • min, max, mean i quartiles dla zmiennych ciągłych,
    • tablice częstości dla zmiennych czynnikowych
    • długość dla wektorów znaków
  • whatis() z pakietu YaleToolkit daje opis zbioru danych


Przykłady pracy z danymi

edytuj

Wybieramy zbiór cats z pakietu MASS.

Znajdujemy podzbiór kotów płci żeńskiej :[10]

b = subset(cats,Sex=='F')

Liczba kotów płci żeńskiej :

nrow(b)

Otrzymujemy :

47

Tworzymy nową tabelę pokazującą zależność płci od wagi ciała ( Bwt) :

d = table(cats$Sex, cats$Bwt)

Otrzymujemy :

    2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9  3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9
 F  3   9   6  12   4   2   3   3   0   3  2   0   0   0   0   0   0   0   0   0
 M  2   1   8   1   5   8   6   9   7   5  9   6   6   5   5   5   4   1   2   2


Znajdujemy liczbę kotów płci męskiej o największej masie ciała :

d[2,ncol(d)]

Otrzymujemy :

2

Koty płci żeńskiej są w pierwszym rzędzie. Sprawdzamy ich liczbę :

 sum(d[1,])

Otrzymujemy

47

Obliczamy liczbę kotów o najmniejszej masie ciała ( są w 1-szej kolumnie) :

sum(d[,1])

Kompletność danych

edytuj

Analiza statystyczna danych

edytuj

Statystyki opisowe

edytuj

Średnia masa ciała wszystkich kotów w kg :

> mean(cats$Bwt)
[1] 2.723611

Średnia masa serca wszystkich kotów w g :

> mean(cats$Hwt)
[1] 10.63056

To samo w inny sposób :

> summary(cats)
Sex         Bwt             Hwt       
F:47   Min.   :2.000   Min.   : 6.30  
M:97   1st Qu.:2.300   1st Qu.: 8.95  
       Median :2.700   Median :10.10  
       Mean   :2.724   Mean   :10.63  
       3rd Qu.:3.025   3rd Qu.:12.12  
       Max.   :3.900   Max.   :20.50

Średnia masa ciała wszystkich kotów płci żeńskiej w kg :

mean(subset(cats$Bwt,Sex=='F'))
[1] 2.359574


Analiza przeżyć

Grafika - prezentacja wyników analizy danych

edytuj

Wczytujemy przykładowe dane :

r = read.csv("http://www.biecek.pl/R/dane/daneSoc.csv", sep=";")

Sprawdzamy nagłówki ramki :

names(r)
[1] "wiek"                  "wyksztalcenie"         "st.cywilny"           
[4] "plec"                  "praca"                 "cisnienie.skurczowe"  
[7] "cisnienie.rozkurczowe"

Możemy tworzyć różne wykresy : [11]

Histogram

edytuj

Rysujemy histogram wieku :[12]

 hist(r$wiek)

i histogram wieku z krzywą rozkładu normalnego : [13]

 x <- r$wiek
h<-hist(x, breaks=10, col="red", xlab="Wiek",
  main="Histogram with Normal Curve")
xfit<-seq(min(x),max(x),length=40)
yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
yfit <- yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2)

Wykres pudełkowy

edytuj

Rysujemy zależność wieku od stanu cywilnego ( zmiennej liczbowej od czynnikowej) :

boxplot(r$wiek ~ r$st.cywilny)

lub wieku od wykształcenia (dla wszystkich typów) :

plot(wiek~wyksztalcenie, data=r)

lub wieku od wykształcenia podstawowego :

plot(wiek~wyksztalcenie, data=r, subset=wyksztalcenie=="podstawowe")

Wykres workowy

edytuj

Jest to rozszserzenie do 2 wymiarów wykresu pudełkowego :

library(aplpack)
attach(r)
bagplot(cisnienie.rozkurczowe,cisnienie.skurczowe, xlab="cisnienie.rozkurczowe", ylab="cisnienie.skurczowe",  main="Przyklad bagplot ")

Wykres skrzypcowy

edytuj
install.packages("UsingR")
library(UsingR)
simple.violinplot(wiek ~wyksztalcenie, data=r, col="red")

Wykres warunkowy

edytuj

( ang. Conditioning Plot = coplot):[14]

coplot(wiek ~ cisnienie.skurczowe|plec, data = r,   panel = panel.smooth, rows = 1)

Wykres par

edytuj
pairs(r)

Wykres gęstości

edytuj
install.packages("UsingR")
library(UsingR)
simple.densityplot(cisnienie.rozkurczowe~wyksztalcenie, data = r)


Wykres

edytuj

Sprawdzamy jak wygląda zależność pomiędzy ciśnieniem skurczowym i wiekiem ( dwoma zmiennymi liczbowymi) :

plot(r$wiek ~ r$cisnienie.skurczowe)


gradient koloru

edytuj

Gradient koloru ( ang. colomap)


Pakiet pals[15]

Zależności:

  • rgl

Mapy kolorów w pakiecie pals są zdefiniowane:

  • za pomocą wzorów matematycznych (np. mapa kolorów Cubehelix), tylko kilka
  • większość map kolorów jest pierwotnie zdefiniowana jako gładka krzywa przechodząca przez sekwencję 256 kolorów.
# Install the released version from CRAN:
install.packages("pals")
# Loading required package: pals
require(pals) 
# Show palettes and colormaps as colored bands of below colormaps
pal.bands(coolwarm, parula, ocean.haline, brewer.blues, cubicl, kovesi.rainbow, ocean.phase, brewer.paired(12), stepped, brewer.seqseq2,main="Colormap suggestions")
# increase number of bands to 200
pal.bands(coolwarm, viridis, parula, n=200)
# Show the amount of red, green, blue, and gray in colors of a palette. The gray line corresponds to luminosity.
pal.channels(parula, main="parula")
# Pokaż mapę kolorów za pomocą wykresu czułości kontrastu Campbella-Robsona ( ang. Campbell-Robson Contrast Sensitivity Chart
pal.csf(parula, main="parula")
# The palette is converted to RGB or LUV coordinates and plotted in a three-dimensional scatterplot. The LUV space is probably better, but it is easier to tweak colors by hand in RGB space.
pal.cube(cubehelix)
pal.cube(coolwarm)
# Display a palette on a choropleth map similar to the ColorBrewer website.
pal.map(brewer.paired, n=12, main="brewer.paired")
# A single palette/colormap is shown as five colored bands: 1.Without any modifications. 2. As seen in black-and-white as if photocopied. 3. As seen by the deutan color-blind. 4. As seen by the protan color-blind. 5. As seen by the tritan color-blind.
pal.safe(parula, main="parula")
# compare 3 colormaps
op <- par(mfrow=c(3,1), mar=c(1,1,2,1))
pal.sineramp(jet, main="jet")
pal.sineramp(tol.rainbow, main="tol.rainbow")
pal.sineramp(kovesi.rainbow, main="kovesi.rainbow")
# test colormap
pal.test(parula)
pal.test(viridis) # dark colors are poor
# rysuje zbiór danych volcano z użyciem mapy kolorów parula
pal.volcano(parula)
# Catalog of colormaps and palettes

Pakiety

edytuj


Pakiet rgl to system wizualizacji 3D oparty na OpenGL. Zapewnia interfejs średniego i wysokiego poziomu do użytku w języku R, obecnie wzorowany na klasycznej grafice R, z rozszerzeniami umożliwiającymi interakcję.


install.packages("rgl")
require(rgl)

Gdzie szukać pomocy

edytuj

Dokumentacja

edytuj

Sprawdzamy informacje o funkcji "is" :

??is

Otrzymujemy okno z wynikami szukania. Z okna wychodzimy Shift+q

Możemy też użyć funkcji help :


help(is)

kończymy za pomocą klawisza q

Aby się znaleźć w pomocy informacje związane z csv wpisujemy w konsoli :[16]

??csv

Otrzymujemy :

Help files with alias or concept or title matching 'csv' using regular
expression matching:
Hmisc::dataDensityString
                        Internal Hmisc functions
Hmisc::csv.get          Read Comma-Separated Text Data Files
MCMCpack::MCMCSVDreg    Markov Chain Monte Carlo for SVD Regression
survey::dimnames.DBIsvydesign
                        Dimensions of survey designs
survey::open.DBIsvydesign
                        Open and close DBI connections
survey::update.survey.design
                        Add variables to a survey design
utils::read.table       Data Input
utils::write.table      Data Output


Type '?PKG::FOO' to inspect entry 'PKG::FOO TITLE'.

Konwencje nazw

edytuj

W dokumentacji :

vioplot {vioplot}

oznacza funkcję vioplot z pakietu/biblioteki vioplot.

Biblioteki i pakiety

edytuj

Przy starcie programu jest wyświetlana informacja jakie biblioteki zostały załadowane. Potem możemy to sprawdzić za pomocą :

sessionInfo()


Sprawdzamy zainstalowane biblioteki :

library()


Wynik jest wyświetlany w domyślnym edytorze

Zainsatlowane pakiety :


installed.packages()



W dokumentacji :

vioplot {vioplot}

oznacza funkcję vioplot z pakietu/biblioteki vioplot. Jeśli ta biblioteka nie jest instalowana przy starcie to należy :

  • zainstalować pakiet vioplot :
install.packages("vioplot")
  • załadować do pamięci bibliotekę vioplot :
library(vioplot)
  • już można używać funkcji vioplot :
vioplot(r$wiek[r$wyksztalcenie=="podstawowe"], r$wiek[r$wyksztalcenie=="srednie"])


Lub za pomocą [17]:

if(!require(somepackage)){
   install.packages("somepackage")
   library(somepackage)

}

obiekty

edytuj

Funkcja

ls()

lub

objects()

wyświetla zdefiniowane obiekty

Internet

edytuj

Jak zadawać pytania

edytuj

Jest to opisane w kilku poradnikach.[18] [19]

W pytaniu podaj dane których używasz. Dzięki temu inni użytkownicy będą mogli sami przetworzyć te dane i porównać wyniki.

  • Mogą być to dane tworzone losowo, np. z użyciem funkcji set.seed. Oczywiście musisz podać kod za pomocą którego utworzono dane.
  • duży zbiór danych możesz umieścić w przestrzeni publicznej, np. Dropbox
  • możesz podać tekstowy dokładny opis danych na których pracujesz utworzony za pomocą funkcji dput. Opis ten można użyć do odtworzenia danych ( dget z pliku albo wkleić tekst structure(....) i przypisać go do zmiennej.


Przykład tekstowego opisu danych:

a =  structure(list(id = c(39L, 471L, 497L, 927L, 663L, 525L, 580L, 
622L, 48L, 727L), age = c(22.6273628946641, 35.237619316895, 
29.6406734238401, 49.7885287820185, 42.6482063541433, 35.8383991257624, 
33.1517001030015, 36.814031442543, 42.5628727298572, 48.4957262906764
)), .Names = c("id", "age"), row.names = c(39L, 471L, 497L, 927L, 
663L, 525L, 580L, 622L, 48L, 727L), class = "data.frame")

Pokaż kod na którym pracujesz. Podaj minimalną jego ilość, wystarczającą do pokazania błędu/problemu którego nie potrafisz rozwiązać. Kod powinien pracować po skopiowaniu i wklejeniu na czystej sesji R. Nie zapomnij podać niezbędnych bibliotek.

Słownictwo

edytuj

Używaj właściwego słownictwa. Np jeśli nie wiesz jakiego typu jest obiekt to sprawdź to za pomocą funkcji class.

Dodatkowe materiały

edytuj

Bibliografia

edytuj
  1. R (język programowania) w wikipedii
  2. data from a program
  3. rene nyffenegger notes: R packages datasets volcano
  4. R Data Import/Export Version 2.12.1 (2010-12-16) by R Development Core Team
  5. wikipedia:CSV (format pliku) CSV (format pliku) w polskiej wikipedii
  6. [R] Eksport danych z Excela do R na Forum Miłośników Statystyki
  7. Przemysław Biecek - strona domowa
  8. Three tips for posting good questions to R-help and Stack Overflow at Sigmafield - Statistical Computing Resource
  9. P Biecek : Przewodnik po pakiecie R. GIS 2008, str. 81
  10. Subsetting Data by Robert I. Kabacoff
  11. Graficzna prezentacja i analiza danych - Katedra Statystyki Akademia Ekonomiczna w Katowicach
  12. histogram in R at UCLA Academic Technology Services
  13. Histogram , przykład Petera Dalgaarda w QuickR
  14. coplot (graphics) w r wiki
  15. pals - pakiet R do obsługi gradientów koloru
  16. [R] Eksploracja danych z pliku csv na Forum Miłośników Statystyki
  17. : Elegant way to check for missing packages and install them?
  18. Three tips for posting good questions to R-help and Stack Overflow at sigmafield
  19. R posting guide