R (język programowania)

R-Logo

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.

WprowadzenieEdytuj

Przykładowa sesjaEdytuj

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")


EdycjaEdytuj

domyślny edytor tekstowy w konsoliEdytuj

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 edytoryEdytuj

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

DaneEdytuj

typy danychEdytuj

 
dane ucięte

FunkcjeEdytuj

Funkcje :

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

Źródła danychEdytuj

Dane wewnętrzny REdytuj

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))

amlEdytuj

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

nie wczytujemy ich za pomocą data tylko :

aml

catsEdytuj

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

mtcarsEdytuj

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 plikachEdytuj

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]

KatalogiEdytuj

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()

PlikiEdytuj

Pliki binarneEdytuj
Pliki tekstoweEdytuj
CSVEdytuj

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 :

Dane tworzone przez użytkownikaEdytuj

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

Ekport danychEdytuj

Zapis danych do pliku csv

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

Przygotowanie danych do analizyEdytuj

ObiektyEdytuj

Sprawdzamy objekty :

objects()

przykłądowy wynik :

character(0)

Typ obiektuEdytuj

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 danymiEdytuj

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ść danychEdytuj

Analiza statystyczna danychEdytuj

Statystyki opisoweEdytuj

Ś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 danychEdytuj

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]

HistogramEdytuj

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łkowyEdytuj

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 workowyEdytuj

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 skrzypcowyEdytuj

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

Wykres warunkowyEdytuj

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

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

Wykres parEdytuj

pairs(r)

Wykres gęstościEdytuj

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


WykresEdytuj

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

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



PomocEdytuj

Gdzie szukać pomocyEdytuj

DokumentacjaEdytuj

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 nazwEdytuj

W dokumentacji :

vioplot {vioplot}

oznacza funkcję vioplot z pakietu/biblioteki vioplot.

Biblioteki i pakietyEdytuj

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)

}

obiektyEdytuj

Funkcja

ls()

lub

objects()

wyświetla zdefiniowane obiekty

InternetEdytuj

Jak zadawać pytaniaEdytuj

Jest to opisane w kilku poradnikach.[16] [17]

DaneEdytuj

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")

KodEdytuj

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łownictwoEdytuj

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łyEdytuj

BibliografiaEdytuj

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