Twitter: @grzegg
Kategoria: programowanie, Tagi: - - .

R – zmienne i serie danych (wektory)

R jest środowiskiem przeznaczonym przede wszystkim do obliczeń statystycznych, a te jak wiadomo operują na mniejszych lub większych zestawach danych. Poprzednio poznaliśmy metody wykonywania prostych obliczeń oraz generowania sekwencji liczb. Teraz przyszedł czas na to, żeby dowiedzieć się jak przechowywać wyniki obliczeń, sekwencje danych, oraz jak przeprowadzać na nich niektóre operacje, także statystyczne.

Zmienne

Jeśli nasze obliczenia sprowadzają się do pojedynczych, niepowiązanych ze sobą działań, powinno wystarczać nam wpisywanie wprost działań i danych. Np.:

> 189*4/(123+2)
[1] 6.048

Ale nie po to przecież chcemy uczyć się R, żeby używać go wyłącznie w charakterze prostego kalkulatora. Jeśli będziemy wykonywać bardziej złożone operacje, warto by mieć sposób na wygodne przechowywanie wielokrotnie wykorzystywanych wartości, bądź wyników obliczeń. Do tego celu, służą właśnie zmienne.
Zmienną można sobie wyobrazić, jako pojemnik z etykietą (nazwą) w której przechowywana jest jakaś wartość. Zmienna może przechowywać różne wartości, można je także zmieniać, a odwołujemy się do niej używając nazwy zmiennej.
Na przykład wyobraźmy sobie, że chcemy dokonać serii obliczeń dotyczących koła o promieniu równym 1342.23 m, używając liczby π z dokładnością do czwartego miejsca po przecinku, czyli 3.1415. Można by to zrobić tak:
Obwód koła (2πr):
> 2*3.1415*1342.23
[1] 8433.231

Pole koła (πr2):
> 3.1415*1342.23^2
[1] 5659668

Da się, ale zróbmy teraz to samo z użyciem zmiennych. Najpierw stwórzmy dwie zmienne, do przechowywania liczby π oraz r:

> PI=3.1415926535
> r=1342.23

Teraz sprawdźmy nasze zmienne, wpisując:
> PI
Otrzymamy:
[1] 3.141593
A teraz r:
> r
[1] 1342.23

Czas na obliczenia…
Obwód koła (2πr):
> 2*PI*r
[1] 8433.231

Pole koła (πr2):
> PI*r^2

[1] 5659668
Prawda, że bardziej przejrzyście? W dodatku nie trzeba przepisywać (kopiować i wklejać) długich liczb. Nawiasem mówiąc, w R domyślnie jest zakodowana liczba π, możemy ją uzyskać wpisując… pi
> pi
[1] 3.141593

Przy okazji warto zwrócić uwagę, że wielkość liter ma znaczenie w nazwach zmiennych. Liczba, liczba, LICZBA to trzy różne zmienne, każda z nich może mieć inną wartość.

Zmienne, jak sama nazwa wskazuje, nie są niezmienne, możemy zmieniać ich wartość:
> r=1342.23
> PI*r^2
[1] 5659668
> r=238.39
> PI*r^2
[1] 178530.8

Przypominam, że do wcześniejszego polecenia można łatwo wrócić używając strzałki w górę na klawiaturze. W powyższym przykładzie nie musimy więc nawet przepisywać wyrażenia PI*r^2, wystarczy go powtórnie przywołać.

Do zmiennej można przypisać także wynik operacji przeprowadzanej na liczbach i zmiennych:
> pole=PI*r^2
> pole
[1] 178530.8

Zmienne mogą przechowywać nie tylko liczby. Mogą to być na przykład litery, ciągi znaków (np. tekst) i innego rodzaju wartości. Wykonaj takie polecenie:
> nazwisko="Skywalker"
Teraz sprawdzimy wartość:
> nazwisko
[1] "Skywalker"

Wektory

Tworzenie wektorów

We wpisie poświęconym pierwszym krokom w R poznaliśmy funkcję seq() pozwalającą na uzyskanie sekwencji liczb. Na przykład wydając komendę
> seq(1:10)
Możemy otrzymać sekwenecję liczb od 1 do 10
[1] 1 2 3 4 5 6 7 8 9 10

Czy istnieje sposób, żeby taki zestaw liczb przechować?

Spróbujmy zrobić coś podobnego jak zrobiliśmy w przypadku zmiennych:
> liczby=seq(1:10)

Sprawdźmy, czy się udało:
> liczby
[1] 1 2 3 4 5 6 7 8 9 10

To co stworzyliśmy, nazywamy wektorem. Wektor to struktura przechowująca dane jednego typu. Może więc np. przechowywać liczby albo ciągi znaków ale nie jednocześnie liczby i ciągi znaków.

Wektor możemy także stworzyć i wypełnić wartościami „ręcznie”. Służy do tego polecenie c(), w nawiasie umieszczamy wartości przedzielone przecinkami. Poniżej parę przykładów.

Najpierw wektor z liczbami całkowitymi:
> liczby=c(1,12,2,6,7,4,3)
> liczby
[1] 1 12 2 6 7 4 3

Teraz zamiast 2 wprowadźmy 2.5:
> liczby=c(1,12,2.5,6,7,4,3)
> liczby
[1] 1.0 12.0 2.5 6.0 7.0 4.0 3.0

Zauważ, że wystarczyło tylko jedną liczbę przedstawić jako dziesiętną. Reszta się automatycznie „dostosowała”.

Przyszedł czas na ciągi znaków:
> bohaterowie=c("Luke Skywalker", "Yoda", "Han Solo", "Księżniczka Leia", "Chewbacca")
> bohaterowie
[1] "Luke Skywalker" "Yoda" "Han Solo" "Księżniczka Leia" "Chewbacca"

Proste operacje na wektorach

Z wektora możemy łatwo pobrać wybraną wartość, wpisując jej pozycję w ciągu (licząc od 1):
> bohaterowie[2]
[1] "Yoda"

Można też wybrać część sekwencji, na przykład elementy od 2 do 4:
> bohaterowie[2:4]
[1] "Yoda" "Han Solo" "Księżniczka Leia"

Zapis 2:4 wygląda znajomo, tak przecież generowaliśmy sekwencje liczb.

Można też zrobić tak:
> l=c(1:3,5)
> bohaterowie[l]
[1] "Luke Skywalker" "Yoda" "Han Solo" "Chewbacca"

Można też np. wygenerować numery (indeksy) elementów przy pomocy znanej nam funkcji seq():
> l=seq(5,1,by=-2)
> bohaterowie[l]
[1] "Chewbacca" "Han Solo" "Luke Skywalker"

Do wektora można dodać nowy element:
> bohaterowie[6]="Anakin Skywalker"
> bohaterowie
[1] "Luke Skywalker" "Yoda" "Han Solo" "Księżniczka Leia" "Chewbacca" "Anakin Skywalker"

Można też zmienić dowolny element:
> bohaterowie[6]="Lord Vader"
> bohaterowie
[1] "Luke Skywalker" "Yoda" "Han Solo" "Księżniczka Leia" "Chewbacca" "Lord Vader"

Wektorów można używać między innymi jako wygodnych zbiorów danych, które poddajemy różnego rodzaju operacjom, na przykład statystycznym. Szerzej zajmiemy się tym zagadnieniem w przyszłości, na razie kilka przykładów na zachętę:
Tworzymy zestaw danych:
> pomiary=c(3.3,4,5,4.6,4,3.7,3,2.9,4,5.1,5)
Liczba elementów w wektorze:
> length(pomiary)
[1] 11

Suma elementów w wektorze:
> sum(pomiary)
[1] 44.6

Najmniejsza liczba w wektorze:
> min(pomiary)
[1] 2.9

Największa liczba w wektorze:
> max(pomiary)
[1] 5.1

Średnia arytmetyczna liczb w wektorze:
> mean(pomiary)
[1] 4.054545

Przypisywanie wartości

Na koniec warto jeszcze wspomnieć o różnych sposobach przypisywania wartości zmiennym czy wektorom (i innym strukturom które poznamy). Dotychczas używaliśmy znaku równości (=), ale można również stosować operatory przypisania: <- oraz ->. Pierwszy z nich działa analogicznie do znaku =, drugi pozwala przypisać wartość wyrażenia z lewej strony do zmiennej czy wektora znajdującego się po prawej stronie. Sprawdźmy to:
> liczby=c(1,2,3,4)
> liczby
[1] 1 2 3 4
> liczby<-c(1,2,3,4)
> liczby
[1] 1 2 3 4
> c(1,2,3,4)->liczby
> liczby
[1] 1 2 3 4

Istnieją pewne różnice w działaniu operatorów "=" oraz "<-", ale na tym etapie nie powinniśmy na nie natrafić.

Leave a Reply