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]
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
Dane
[edytuj]typy danych
[edytuj]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))
aml
[edytuj]Dane są zawarte w pakiecie survival. Z uwagi na użycie lazyData[2]
nie wczytujemy ich za pomocą data tylko :
aml
cats
[edytuj]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
[edytuj]Pliki binarne
[edytuj]Pliki tekstowe
[edytuj]CSV
[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 :
- UC Irvine Machine Learning Repository
- datasets at Department of Informatics Nicolaus Copernicus University
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
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)
pals
[edytuj]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]- r-colorspace i opis
- cetcolor = CET Perceptually Uniform Colour Maps (cetcolor)
rgl
[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)
Pomoc
[edytuj]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]- Forum Miłośników Statystyki ( w tym i R )
- Wrocławski Zlot Użytkowników R
- wyszukiwarka R
- R code at google
Jak zadawać pytania
[edytuj]Jest to opisane w kilku poradnikach.[18] [19]
Dane
[edytuj]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")
Kod
[edytuj]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]- ↑ R (język programowania) w wikipedii
- ↑ data from a program
- ↑ rene nyffenegger notes: R packages datasets volcano
- ↑ R Data Import/Export Version 2.12.1 (2010-12-16) by R Development Core Team
- ↑ wikipedia:CSV (format pliku) CSV (format pliku) w polskiej wikipedii
- ↑ [R] Eksport danych z Excela do R na Forum Miłośników Statystyki
- ↑ Przemysław Biecek - strona domowa
- ↑ Three tips for posting good questions to R-help and Stack Overflow at Sigmafield - Statistical Computing Resource
- ↑ P Biecek : Przewodnik po pakiecie R. GIS 2008, str. 81
- ↑ Subsetting Data by Robert I. Kabacoff
- ↑ Graficzna prezentacja i analiza danych - Katedra Statystyki Akademia Ekonomiczna w Katowicach
- ↑ histogram in R at UCLA Academic Technology Services
- ↑ Histogram , przykład Petera Dalgaarda w QuickR
- ↑ coplot (graphics) w r wiki
- ↑ pals - pakiet R do obsługi gradientów koloru
- ↑ [R] Eksploracja danych z pliku csv na Forum Miłośników Statystyki
- ↑ : Elegant way to check for missing packages and install them?
- ↑ Three tips for posting good questions to R-help and Stack Overflow at sigmafield
- ↑ R posting guide