Pakiety Matematyczne - R Zestaw 2. Część przykładów pochodzi z helpa do R i z książki: R.Biecek, Przewodnik po pakiecie R, GIS 2014, strona www: http://www.biecek.pl, Instrukcje warunkowe Składnia instrukcji warunkowej: 1. if(cond) iftrue, na przykład if( x > 2 ){ print("jest większe od 2") } 2. if(cond) iftrue else iffalse, na przykład if( x > 2 ) { print("jest większe od 2") } else { # else nie może być w nowej linii!!! print("nie jest większe niż 2") } 3. (dla prostych sytuacji) ifelse(cond,iftrue,iffalse ), na przykład ifelse( x > 2, "jest większe od 2", "nie jest większe niż 2") Pętla for Składnia pętli for: for( iterator in indeksy) expr, indeksy nie muszą być liczbami, może to być w zasadzie dowolny wektor 1. x = c(0,1,2,3,4,5,6,7,8,9) for(i in 1:10){ x[i]=x[i]+2^i } 2. x = rep(0,10) for(i in c(2,5,1,2,3,2,2){ x[i]=x[i]+2^i }
3. x = c("krzesło",na,"dąb", 3,"nic") for(i in x){ cat(paste("element", i,"\n")) } Pętla while Składnia pętli while: while(cond) expr, pętla wykonuje expr dopóki cond jest prawdą 1. i <- 0 while(i < 3) { cat(paste("juz", i, "\n")) i <- i+1 } Definiowanie funkcji Podstawowa składnia: nazwafunkcji = function(argumenty) kod_funkcji return(value) 1. prosta funkcja można pominąć return foo1 = function(x,y) x^2+y-1 2. foo2 = function(x,n){ var = 0 # zmienna lokalna for(i in rep(x,n)){ var = var+i } return(var) } 3. Argumenty w definicji mogą przyjmować wartości domyślne patrz wykład foo3 = function(x,y=0) x^2+y-1 Inne polecenia warte uwagi: Instrukcje proceduralne: switch, repeat Odczyt/zapis Do zapisu/odczytu danych z pliku służą funkcje z rodziny write / read patrz wykład Do odczytu informacji z konsoli służy funkcja scan. Ma ona znacznie większe możliwości (patrz help) nazwa = scan() # wczytuje kolejne wartości liczbowe do zmiennej #nazwa, wczytanie pustej linii kończy wczytywanie
nazwa = scan(what="",sep="\n") # wczytuje kolejne łańcuchy tekstowe #do zmiennej nazwa, wczytanie pustej linii kończy wczytywanie Do wyświetlania informacji na ekranie służy funkcja print print("jakiś tekscik") x <- c(0,12,3,) print(x) Do łączenia łańcuchów tekstowych, wartości liczbowych etc... i wyświetlania ich na ekranie służy funkcja cat x <- 4 cat("wartość zmiennej x:",x) cat("a","b","c","d") cat("a","b","c","d", sep=", ") cat("a","b","c","d", sep=" <-> ") Odczyt/zapis: write.table, write.csv, read.table, read.csv, scan, save, load, sprintf Zadanie 1 1. Zapoznać się z funkcją pbirthday. 2. Obliczyć prawdopodobieństwo, że dokładnie 2 osoby ze wszystkich obecnych na sali urodziły się tego samego dnia. 3. Napisać skrypt, który prosi użytkownika o podanie liczby studentów. Jeśli liczba podana przez użytkownika jest dodatnia, to oblicza i wyświetla na ekranie prawdopodobieństwo, że dokładnie 3 studentów urodziło się tego samego dnia. 4. Napisać funkcję foo4(nmin,nmax,k,filename), o domyślnych wartościach argumentów nmin=1, nmax=366, k=2, która a. Dla wszystkich n = nmin,..., nmax oblicza prawdopodobieństwo P, że dokładnie k osób z n urodziło się tego samego dnia. b. Otrzymane wyniki umieszcza w tablicy, której wiersze są postaci n k P (wskazówka: użyć cbind ) c. Przy pomocy funkcji colnames nadaje kolumnom tablicy etykiety n, k i P. d. Zapisuje tą tablicę do pliku o nazwie filename.txt z wykorzystaniem funkcji write.table
Ramki (zbiory) danych (data.frame) Ramki danych to macierze o różnych typach kolumn. Przykłady wbudowanych ramek danych : mtcars Tworzenie data.frames zm1<-c(6.1, 2.2, 1.7, 4.5) zm2<-c( Do, Re, Mi, Fa ) zm3<-c(t,f,t,f) Polecenie zd<-data.frame(zm1, zm2, zm3) tworzy zbiór danych zd. Każda kolumna (zmienna) jest innego typu. s tr(zd) - wyświetla strukturę zd, m.in. liczbę kolumn (zmiennych) i wierszy (obserwacji) subset(zd, warunki na zmienne) - wybiera zmienne i obserwacje ze zbioru danych zd spełniające zadane warunki subset(zd,zm1>3) zd[m:n,p:r] - wybiera ze zd obserwacje od m-tej do n-tej dla zmiennych od p-tej do r-tej zd[ nazwa_zmiennej ] - wybiera ze zd obserwacje dla zmiennej o podanej nazwie zd[m:n, nazwa_zmiennej ] - wybiera ze zd obserwacje od m-tej do n-tej dla zmiennej o podanej nazwie subset(zd[c("zm1","zm3")],zm2=="a") ranking<-order(zd["zm1"]) ranking zd[ranking,] head(zd) -pięć pierwszych obserwacji zd tail(zd) - pięć ostatnich obserwacji zd
Zadanie 2 Stworzyć zbiór danych naukowcy składający się z wektorów: nazwisko <- c("feynman", "Kosterlitz", "Haldane", "Thompson", "Hardy", "Smale") zawod <- c("fizyk", "fizyk", "fizyk","matematyk", "matematyk", "matematyk") rok.urodzenia<- c(1918, 1943, 1951, 1932, 1877, 1930) nobel <- c(true,true,true, FALSE, FALSE, FALSE) 1. Używając funkcji str sprawdzić strukturę zbioru naukowcy. 2. Wyświetlić wszystkie dane o Kosterlitzu. 3. Jaki zawód wykonuje Smale? 4. Wyświetlić naukowców, którzy urodzili się po roku 1939. 5. Wyświetlić tylko naukowców, którzy otrzymali nagrodę Nobla. 6. Posortować naukowców względem kolumny rok.urodzenia (wskazówka: użyj funkcji order ) 7. Zmienić zadanie 1.4 b) tak, aby n, k, P były zapisywane do zbioru danych, a nie do macierzy.