70 pnzulłrry
Podobnie Jak wektory, listy są ciągami obiektów. Pierwsza różnica pomiędzy listar, a wektorami polega na typie elementów składowych, w listach każdy element mo1 być innego typu. Druga różnica, to możliwość odwoływania się do elementów listy; za pomocą nazwy tego elementu (elementy wektora mogą posiadać nazwy, nie j-jednak możliwe odwoływanie się do tych elementów z użyciem operatora $).
> tt tworzymy listę trzech elementów o różnych typach
> lista « list(1:3, imię - "Bartek", nazwisko = "Nowak", czyKobieta » F)
> # odwołujemy 3ię przez nazwę do elementu drugiego
> lista$imie [1] "Bartek"
> * odwołujemy się do pierwszego elementu, wynikiem jest lista
> lista[l]
CW3 tl] 123
> t do elementów list odwołujemy się nawiasami podwójnymi [[]]
> listaCCl]]
Cl] 12 3 ,,
> # pierwszy ^element listy to wektor, możemy więc użyć takiego zapisu
> listaCCl]] C2]
C13 2
> # funkcja lapplyO pozwala na wykonanie określonego działania (tutaj
zamiana liter na duże), na każdym z elementów listy
> lapply(lista,toupper)
CCI]]
Cl] "1" "2“ "3"
$imie
tl] "BARTEK"
SnazwiBko Cl] "NOWAK"
SczyKobieta Cl] "FAŁSE"
Funkcja lapply(base) o argumentach X i FUN pozwala na wykonanie funkcji FUN, dla każdego elementu listy X. Często wygodnie jest w miejsce argumentu FUN użyć funkcji anonimowych. Wynikiem działania funkcji lapplyO jest lista, której poszczególne elementy są wynikami działania funkcji FUN na kolejnych elementach^ listy X. Jeżeli zostaną podane dodatkowe argumenty do funkcji lapplyO, to zostaną; one przekazane do funkcji FUN.
Wynikiem funkcji lapplyO jest lista. Jeżeli w wyniku chcielibyśmy otrzymać wektor, to jednym z rozwiązań jest zamiana listy na wektor funkcją unlist(base). Inną możliwością jest użycie funkcji sapply(base), która działa podobnie do funk-4 cji lapplyO, ale ma dodatkowy argument simplify, który jeżeli przyjmuje warto TRUE (domyślnie), to wynik w miarę możliwości (jeżeli jest zgodność typów elemen-. tów listy) jest upraszczany do wektora. Inne funkcje z rodziny *apply() wymieniona są w tabeli 2.3. Poniżej przedstaw lamy kilka przykładów użycia tych funkcji. Są one często wykorzystywane przy przet warzaniu danych w macierzach i ramkach danych, tak więc jeszcze do nich wrócimy.
Tabela 2.3: Funkcje z rodziny *apply() z pakietu bose
Wielowymiarowy odpowiednik funkcji sapplyO. Argumentami tej funkcji jest funkcja f un oraz kilka (dwa lub więcej) wektorów o tej samej długości. Wynikiem jest wektor, w którego pozycji i jest wynik fimkcji fun wywołanej z argumentami określonymi przez elementy o indeksach i pozostałych argumentów funkcji mapplyO.
nappiy(fun
rapply(x, fun) Rekursywna wersja lapplyO przydatna, gdy mamy do czynienia z listą list lub innymi, zagnieżdżonymi strukturami. eapply(env, fun) Aplikuje funkcje fun do każdego elementu wskazanego środowiska (przestrzeni nazw) env.
tapply(z, index, Wykonuje funkcje fun dla podzbiorów wektora z określone-fun) go przez poziomy zmiennej czynnikowej index. Przydatna
funkcja, gdy chcemy policzyć pewną statystykę w podgrupach, np. średni wiek w podziale na pleć. W tym przypadku x będzie wektorem z wiekiem, index wektorem z płcią a fun będzie funkcją mean).
repiicateCn, expr) Ta funkcja powoduje n-krotne wykonanie polecenia expr.
Wynikiem jest lista, której kolejne elementy zawierają war- i tość zwróconą w wyniku wywołania wyrażenia expr. Przydatna funkcja w sytuacji gdy w poleceniu jest jakaś rando-mizacja (np. do generowania rozkładu statystyki testowej). aggregate(x, by, Wykonuje funkcję fun dla kolumn macierzy x określonego fun) przez poziomy zmiennych czynnikowych zapisanych w liście
by. Podobna w działaniu do tapplyO, przy czym argument x może być macierzą (w tapplyO był wektorem) a grupowanie w podpopulacjach może być określone przez więcej niż jedną zmienną (argument by może określać więcej zmiennych grupujących).
by(x, index, fun)
Odpowiednik funkcji tapplyO z tą różnicą, że x może być macierzą, a wynik tej funkcji jest specyficznie wyświetlany.
■ > # wyznaczamy średnią wartość cechy w podpopulacjach, zmienna cecha to macierz o dwóch dwudziestoelementowych kolumnach
> cecha => cbindfrunif (20), rnorm(20))
> dlm(cecha)
,:\ W 20 2
> ż nazwijmy kolumny macierzy cecha
>, ćolnames (cecha) - c("cecha A”, "cecha B")
> # do podziału no grupy użyjemy zmiennych czynnikowych, utworzonych
.'V;: z użyciem funkcji gl()
> (podpopulacje • gl(2,10,labels • e("H","K")))
'tl] MMMMMMMMMMKKKKKKKKKK T.evela: H K
> ż określmy jeszcze jedną zmienną czynnikową, też o 20 elementach
> (grupy - gl(2,l,20,labelo - <;("»", "C")))
tl] BCBCBCBCBCBCBCBCHCHC
(-evels: B C