UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI LABORATORIUM TECHNOLOGIA SYSTEMÓW INFORMATYCZNYCH W BIOTECHNOLOGII Pakiet R: Cz. II Strona 1 z 7
OBIEKTY Faktory (factors) Faktor jest specjalną strukturą, przechowującą oprócz danych informacje o powtórzeniach takich samych wartości oraz o zbiorze unikalnych wartości ciągu elementów. Faktor można utworzyć poprzez zdefiniowanie wektora z wartościami i następnie przekonwertowanie go do faktora za pomocą funkcji factor(): > settings = c("high", "Medium", "Low") > settings = factor(settings) > settings [1] High Medium Low Levels: High Low Medium Zestawienie ilości poszczególnych wartości możemy uzyskać przy użyciu funkcji table() np.: > table(settings) settings High Low Medium 1 1 1 Funkcja cut pozwala pogrupować dane wektora w przedziały np.: > liczby = c(1,2,3,4,5,6,7,8,9,10) > cut(liczby, c(0,3,6,10)) [1] (0,3] (0,3] (0,3] (3,6] (3,6] (3,6] (6,10] (6,10] (6,10] (6,10] Levels: (0,3] (3,6] (6,10] Macierze (matrices) / Tablice (arrays) Tablica jest wektorem, zawierającym dodatkowe dane określające uporządkowanie elementów. Najprostszą i najczęściej stosowaną formą jest tablica dwuwymiarowa (macierz), jednak istnieje możliwość stosowania dowolnej liczby wymiarów. Tablice są bardzo wygodnym narzędziem do przechowywania informacji, gdyż niezależnie od uporządkowania elementów w wiersze i kolumny, cała tabela jest dostępna pod postacią jednolitego wektora. Indeksowanie tablic odbywa się podobnie do wektorów; w nawiasie kwadratowym podajemy współrzędne indeksowanego elementu. W razie pominięcia współrzędnej wynikiem indeksowania jest cały rząd lub kolumna. Jeśli pomijamy współrzędną w indeksie, należy pamiętać o pozostawieniu przecinka. Strona 2 z 7
Tablice można stworzyć z istniejącego już wektora, poprzez przypisanie wymiarów do funkcji dim() wywołanej na wektorze. Innymi, bardziej naturalnymi funkcjami tworzącymi tablice są matrix() i array(). > tbl=1:20 > dim(tbl)=c(4,5) #wektor staje się tablicą o wymiarach 4,5 > tbl [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 Istnieje możliwość zmiany wymiarów istniejącej już tablicy bez żadnych ograniczeń (z wyjątkiem wymogu, aby iloczyn wymiarów był równy ilości elementów). > dim(tbl) #wyświetlenie wymiarów [1] 4 5 > dim(tbl) = c(2,10) #zmiana wymiarów tablicy > tbl [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 3 5 7 9 11 13 15 17 19 [2,] 2 4 6 8 10 12 14 16 18 20 Jeśli parametrem w nawiasie kwadratowym (indeksem) jest tablica o dwóch kolumnach, rezultatem jest wektor zawierający dane z tabeli o współrzędnych zamieszczonych w poszczególnych wierszach indeksu (wiersz w pierwszym, kolumna w drugim). W ten sposób można się jednorazowo odnosić do całej serii elementów tabeli, niezależnie od ich układu. Funkcje cbind() i rbind() formują tablice z podanych wektorów, poprzez umieszczenie ich rzędami lub kolumnami w nowo tworzonej tabeli. W ten sposób można serie danych łatwo scalić w tabele. Odwrotnie, każdą tabelę można prosto przekształcić na wektor, stosując funkcję as.vector(). Listy (lists) Lista jest uporządkowanym zbiorem elementów różnego typu. Każdy z nich może posiadać również nazwę, przez którą można się do niego odwołać w dalszych operacjach. Do tworzenia list służy funkcja list(). Jeśli wywołamy ją z listą liczb, otrzymamy listę jednoelementowych wektorów: > s = list(1,2) Strona 3 z 7
> s [[1]] [1] 1 [[2]] [1] 2 Jeśli chcemy odwołać się do konkretnego elementu listy i znamy jego numer, to można listę indeksować, jednak indeks należy podać w podwójnych nawiasach kwadratowych. W powyższym przypadku s[[1]] to pierwszy element listy, czyli jednoelementowy wektor z jedynką. Jeśli elementem listy jest wektor wieloelementowy lub tablica, można oczywiście odwoływać się dalej, podając jeszcze jeden indeks, tym razem w pojedynczym nawiasie, np. s[[2]][1]. Każdy z elementów listy może mieć określoną nazwę i takie nazwane listy spotyka się w praktyce najczęściej. Wtedy też można się odnosić do konkretnych elementów poprzez sprzężenie nazwy listy z nazwą elementu znakiem dolara $. Nie musimy pamiętać, który z kolei element nas interesuje, wystarczy znać jego nazwę. Upraszcza to znacznie odwołania do poszczególnych zmiennych listy. > s = list(wekt=c(1,2,3),skal=2,tabl=array(data=1:4,dim=c(2,2))) > s $wekt [1] 1 2 3 $skal [1] 2 $tabl [,1] [,2] [1,] 1 3 [2,] 2 4 Nazwy elementów listy można skracać do takiej długości, która wystarcza do jednoznacznej ich identyfikacji. Istnieje również możliwość łączenia list funkcją c(), np. lista3 = c(lista1,lista2). Ramki (data frames) Ramka to specyficzna struktura środowiska R. Najprościej można określić ją jako macierz, w której poszczególne kolumny mogą zawierać wartości różnego rodzaju. Do utworzenia takiej struktury służy funkcja data.frame(). Można również przekształcić inne struktury na ten typ funkcją as.data.frame(). Aby zaadresować wybraną kolumnę ramki używa się operatora $ z nazwą kolumny. > x = rep(3,4) > y = rep(5,4) Strona 4 z 7
> xy = data.frame(x,y) > xy x y 1 3 5 2 3 5 3 3 5 4 3 5 #utworzenie nowego wektora q poprzez wybranie kolumny x z ramki xy > q = xy$x > q [1] 3 3 3 3 Dodawanie kolumn lub wierszy uzyskuje się wykorzystując funkcje cbind() i rbind(). Pakiet R pozwala na łatwe ładowanie danych z zewnętrznych plików. Każdą tabelę zawartą w pliku tekstowym (utworzoną np. w Excelu poprzez opcję export) można załadować funkcją read.table(). Opcja header w funkcji read.table() oznacza, że plik tekstowy zawiera w pierwszym wierszu nazwy kolumn. Jedną z najważniejszych właściwości obiektów typu lista i ramka jest możliwość ich przyłączenia (attach). Jeśli mamy listę lub ramkę o nazwie lista, zawierającą elementy a i b, to po jej włączeniu, w środowisku zmienne te istnieją bezpośrednio i nie trzeba się odwoływać do nich za pośrednictwem ramki lub listy, aż do czasu jej odłączenia (detach). Sprawdzanie i zmiana typu danych W pakiecie R istnieje grupa funkcji is.typ, która umożliwia identyfikację typu i rodzaju danych. Z kolei grupa funkcji as.typ wykonuje zamianę istniejącego typu lub rodzaju danych na inny. Wynik konwersji należy przypisać do zmiennej, inaczej będzie on nietrwały. W przypadku nonsensownej zamiany danych, np. z typu tekstowego na liczbowy, program dokonuje konwersji do wartości NA (not available). Strona 5 z 7
Zad. 1. Katedra Informatyki Uniwersytetu Rzeszowskiego ZADANIA Proszę utworzyć wektor o nazwie wek zawierający następujące wartości w podanej kolejności: 1,2,2,3,3,3,4,4,4,4,5,5,5,5,5. Do utworzenia obiektu należy wykorzystać funkcję seq() i rep(). Zad. 2. Proszę utworzyć wektor o nazwie z o następujących elementach: 1,2,3,4,12,31,2,51,23,1,23,2341,23,512,32,312,123,21,3, a następnie: a) posortować elementy rosnąco wykorzystując funkcję operującą na wektorach; b) wybrać elementy od 3-go do 7-go; c) zmienić wartość trzeciego elementu z 3 na 7 i wyświetlić cały wektor; d) podać długość wektora z (liczbę elementów); e) utworzyć wektor z100 zawierający tylko te elementy wektora z, których wartości są większe od 100. Zad. 3. Obliczyć dla wektorów: wek1 (o wartościach: 0,0.5,1,,4,4.5,5) i wek2 (o wartościach od -10 do 10 z krokiem równym 2): a) średnie, b) mediany, c) odchylenia standardowe, d) sumy, e) iloczyny elementów, f) wartości zwracane przez funkcje: - pmin, - pmax, - cummin, - cummax diff. Zad. 4. Proszę utworzyć stuelementowe wektory logiczne wl1 (co szósty element ma wartość TRUE, reszta FALSE) i wl2 (co 9-y element ma wartość TRUE, reszta FALSE). a) Ile elementów ma wartość TRUE? Strona 6 z 7
b) Podaj indeksy elementów o wartości TRUE dla połączonych wektorów? c) Jakie wartości będzie posiadał wektor wl3 stanowiący sumę wl1 i wl2? Podaj interpretację wyników. Zad. 5. Proszę utworzyć macierz o nazwie matrix zawierającą liczby od 1 do 7, w 3 kolumnach. Zad. 6. Proszę utworzyć listę o nazwie mylist zawierającą następujące elementy: - Liczbę 5; - Wektor w o elementach: 10, 9, 8, 7, 6, 5; - Tekst seven ; - Macierz mat o wymiarach: 2 x 2 zawierającą liczby całkowite: 2, 3, 1, 5 (w 2 wierszach i 2 kolumnach). Zad. 7. Proszę utworzyć ramkę o nazwie comparativegenomesize zawierającą 3 wektory: - wektor pierwszy o nazwie organizm z elementami: "Human", "Mouse", "Fruit Fly", "Roundworm", "Yeast"; - wektor drugi o nazwie genomesizebp z elementami: 3000000000, 3000000000, 135600000, 97000000, 12100000; - wektor trzeci o nazwie estgenecount z elementami: 30000, 30000, 13061, 19099, 6034. Jako nazwy kolumn ramki należy zastosować nazwy wektorów. UWAGA! Całą sesję należy zapisać w pliku o nazwie identyfikującej użytkownika w swoim folderze. Utworzone powyżej obiekty będą wykorzystywane na następnych zajęciach! Lokalizację zapisywanych plików określamy poleceniem Change dir z menu Plik. Obraz przestrzeni roboczej zapisujemy komendą: > save.image(file= nazwa_użytkownika.rdata ) Strona 7 z 7