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.
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)
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. [3]
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[4] 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[5]
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 [6] 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.[7]
Istnieją funkcje, które można wykonać na obiektach dowolnego typu :[8]
- 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 :[9]
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 : [10]
Histogram Edytuj
Rysujemy histogram wieku :[11]
hist(r$wiek)
i histogram wieku z krzywą rozkładu normalnego : [12]
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):[13]
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)
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 :[14]
??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ą [15]:
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.[16] [17]
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
- ↑ 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
- ↑ [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