c(TRUE, FALSE, FALSE)
[1] TRUE FALSE FALSE
W R praktycznie wszystko jest obiektem. Może to być zbiór danych, ale także wykres czy mapa. Zasadnicza różnica to klasa tych obiektów i operacje jakie mogą być na nich wykonywane.
Funkcje w R wymagają jako argumentów określonych typów obiektów - stąd tak ważna jak znajomość istniejących struktur.
Każdy obiekt w R możemy przypisać do tzw. obiektu nazwanego. Wówczas jest przechowywany w pamięci i można się do niego odwołać. Przypisanie odbywa się za pomocą operatora <-
.
nazwa <- obiekt
obiekt -> nazwa
Można także przypisywać obiekty z wykorzystaniem znaku równości =
, ale nie jest to zalecane ponieważ symbol ten jest używany w innych miejscach np. do deklarowania wartości argumentów w funkcji.
W R dostępna jest funkcja assign
, która także umożliwia przypisanie nazwy do obiektu:
assign("nazwa", obiekt)
Wektor jest najprostszym typem danych w R. Najczęściej korzysta się z trzech typów wektorów:
Wektor tworzy się z wykorzystaniem funkcji c()
.
Przyjmuje wartości prawda lub fałsz:
c(TRUE, FALSE, FALSE)
[1] TRUE FALSE FALSE
lub w skróconej wersji:
c(T, F, F)
[1] TRUE FALSE FALSE
Do sprawdzenia długości wektora używa się funkcji length
:
length(c(T, F, F))
[1] 3
lub korzystając z obiektu nazwanego:
<- c(T,F,F)
wart_log length(wart_log)
[1] 3
Wektory można także utworzyć poprzez replikację określonej wartości lub wektora z wykorzystaniem funkcji rep
. Funkcja ta przyjmuje co najmniej dwa argumenty: obowiązkowo x
- wektor wejściowy oraz jeden z następujących: times
- liczba powtórzeń elementów wektora x
, each
- liczba powtórzeń elementów wektora x
(wyjaśnienie różnicy poniżej) lub length.out
- oczekiwana długość wektora wynikowego.
Trzy równoważne zapisy:
rep(x = c(T,F), times = 3)
[1] TRUE FALSE TRUE FALSE TRUE FALSE
rep(c(T,F), times = 3)
[1] TRUE FALSE TRUE FALSE TRUE FALSE
rep(c(T,F), 3)
[1] TRUE FALSE TRUE FALSE TRUE FALSE
A tak to wygląda z argumentem each
:
rep(c(T,F), each = 3)
[1] TRUE TRUE TRUE FALSE FALSE FALSE
Wykorzystanie argumentu length.out
:
rep(c(T,F), length.out = 5)
[1] TRUE FALSE TRUE FALSE TRUE
W wektorze możemy przechowywać także liczby:
c(1, 3, -5, 2.5, .6) # nie trzeba pisać zera przed ułamkiem
[1] 1.0 3.0 -5.0 2.5 0.6
Połączenie dwóch wektorów to także wektor:
c(c(1,2,3), c(3.5,4,4.5))
[1] 1.0 2.0 3.0 3.5 4.0 4.5
Pojedyncza liczba też jest jednoelementowym wektorem:
length(2)
[1] 1
Proste ciągi o różnicy równej 1 można generować wykorzystując dwukropek:
1:10
[1] 1 2 3 4 5 6 7 8 9 10
lub
c(-5:-1,1:5)
[1] -5 -4 -3 -2 -1 1 2 3 4 5
Do generowania ciągów liczbowych o różnych różnicach wykorzystuje się funkcję seq
, która przyjmuje następujące argumenty. Wartość początkową from
, wartość końcową to
oraz jeden z następujących: by
- krok lub length.out
- oczekiwana długość wektora.
To samo co 1:10
seq(1, 10, 1)
[1] 1 2 3 4 5 6 7 8 9 10
Wartości niecałkowite:
seq(1, 2, 0.2)
[1] 1.0 1.2 1.4 1.6 1.8 2.0
Wektor wartości malejących:
seq(10, 1, by=1) # błędny zapis
Error in seq.default(10, 1, by = 1): wrong sign in 'by' argument
seq(10, 1, by=-1) # poprawny zapis
[1] 10 9 8 7 6 5 4 3 2 1
Tworzenie wektora w oparciu o argument length.out
- funkcja sama dobiera krok:
seq(1, 7, length.out = 13)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0
Do generowania liczb pseudolosowych służy funkcja runif(n)
, która do poprawnego wywołania wymaga tylko jednego argumentu - długości wektora wynikowego. Domyślnie losowane są liczby z przedziału los()
w Excelu), można to jednak zmienić podając odpowiednie wartości argumentów min
i max
.
runif(6)
[1] 0.3195719 0.1278855 0.5032706 0.9783932 0.6031072 0.6790640
Obserwacje można także generować z innych rozkładów:
rnorm
- rozkład normalny,rchisq
- rozkład rt
- rozkład t-studenta,Wykaz wszystkich dostępnych w R rozkładów uzyskamy wywołując polecenie help("Distributions")
.
Za każdym uruchomieniem jednej z wymienionych wyżej funkcji losujących wartości z danego rozkładu otrzymamy inne wartości:
runif(5)
[1] 0.1625951 0.3835654 0.5293908 0.4157393 0.3100997
runif(5)
[1] 0.8787186 0.9163193 0.9412319 0.1133653 0.1806800
Powtarzalność wyników możemy uzyskać ustalając ziarno generatora:
set.seed(123)
runif(5)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
set.seed(123)
runif(5)
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673
W wektorze może być przechowywany tekst - wówczas poszczególne elementy zapisujemy w cudzysłowie lub apostrofach:
c("ala", "ma", "kota")
[1] "ala" "ma" "kota"
c('ala', 'ma', 'kota')
[1] "ala" "ma" "kota"
W RStudio wygodniej używać cudzysłowu, ponieważ program automatycznie go zamyka.
Istnieje także stała zawierająca litery alfabetu:
letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"
LETTERS
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W" "X" "Y" "Z"
Jeśli w wektorze pomieszamy kilka typów zmiennych to R przekształci poszczególne wartości, tak aby stracić jak najmniej informacji:
c(TRUE, 2, 5)
[1] 1 2 5
c(3, "cztery", 5)
[1] "3" "cztery" "5"
W pierwszym przypadku wartość TRUE
została przekształcona na odpowiednik liczbowy - 1. Z kolei w drugim przykładzie podane liczby zostały przekonwertowane na tekst.
Na wektorach logicznych i liczbowych można wykonywać operacje arytmetyczne np. mnożenie:
1:10*2
[1] 2 4 6 8 10 12 14 16 18 20
Wektor liczbowy plus wektor liczbowy:
1:10 + c(1,2)
[1] 2 4 4 6 6 8 8 10 10 12
Wektor liczbowy razy wektor liczbowy:
1:10 * c(1,2)
[1] 1 4 3 8 5 12 7 16 9 20
Wektor liczbowy razy wektor logiczny:
1:10 * c(T, F)
[1] 1 0 3 0 5 0 7 0 9 0
Długości obu wektorów muszą być odpowiednie:
1:10 * c(T,F,T)
Warning in 1:10 * c(T, F, T): longer object length is not a multiple of shorter
object length
[1] 1 0 3 4 0 6 7 0 9 10
Dłuższy z wektorów musi być wielokrotnością krótszego.
Siłą rzeczy działania arytmetyczne na wektorach tekstowych nie są możliwe:
c("jeden", "dwa", "trzy", "cztery") * c(T,F)
Error in c("jeden", "dwa", "trzy", "cztery") * c(T, F): non-numeric argument to binary operator
c("jeden", "dwa", "trzy", "cztery") + c(1,2)
Error in c("jeden", "dwa", "trzy", "cztery") + c(1, 2): non-numeric argument to binary operator
Na wektorach można także wykonywać operacje agregujące:
Funkcja | Działanie |
---|---|
mean() | średnia elementów |
sum() | suma elementów |
prod() | iloczyn elementów |
var() | wariancja elementów |
sd() | odchylenie standardowe elementów |
median() | mediana elementów |
quantile() | kwantyl danego rzędu |
min() | minimum |
max() | maksimum |
Obliczenie skośności i kurtozy jest możliwe po zainstalowaniu pakietu e1071
. Wówczas mamy dostęp do funkcji:
Funkcja | Działanie |
---|---|
skewness() | skośność elementów |
kurtosis() | kurtoza elementów |
Suma wektora numerycznego:
sum(1:10)
[1] 55
Suma i średnia wektora logicznego:
sum(c(T, F, F, T))
[1] 2
mean(c(T, F, F, T))
[1] 0.5
Korzystanie z funkcji pochodzących z pakietów zewnętrznych wymaga wskazania skąd pochodzi dana funkcja. Można to zrobić na dwa sposoby: funkcją library(pakiet)
- wówczas wszystkie funkcje z tego pakietu są wczytywane do pamięci i można do nich sięgać bezpośrednio lub wskazując przed nazwą funkcji z jakiego pakietu pochodzi.
Wczytanie pakietu:
library(e1071)
skewness(c(1,2,3,4,5,7,9,11,13))
[1] 0.3451259
lub równoważnie:
::skewness(c(1,2,3,4,5,7,9,11,13)) e1071
[1] 0.3451259
Podsumowanie rozkładu wektora można także uzyskać z wykorzystaniem funkcji summary(x)
:
summary(1:10)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 3.25 5.50 5.50 7.75 10.00
Działa także na wektorach tekstowych:
summary(c("jeden", "dwa", "trzy", "cztery"))
Length Class Mode
4 character character
Do określenia typu wektora służy funkcja typeof
, class
lub mode
.
typeof(wart_log)
[1] "logical"
Sprawdzenie czy obiekt jest danego typu odbywa się z wykorzystaniem dedykowanych funkcji z przyrostkiem is.
is.logical(wart_log)
[1] TRUE
is.character(wart_log)
[1] FALSE
Czasami jako np. argument funkcji będzie wymagany inny typ wektora aniżeli aktualnie posiadany w pamięci. Można wówczas spróbować przekształcić taki wektor z wykorzystaniem funkcji rozpoczynającej się od as.
:
typeof(wart_log)
[1] "logical"
as.numeric(wart_log)
[1] 1 0 0
typeof(as.numeric(wart_log))
[1] "double"
Aby uzyskać dostęp do części wektora korzysta się z indeksatora w postaci nawiasów kwadratowych. Utworzymy nowy wektor zawierający liczby całkowite od 10 do 20:
<- seq(10,20)
wart_10_20 wart_10_20
[1] 10 11 12 13 14 15 16 17 18 19 20
a następnie wybieramy trzecią obserwację:
3] wart_10_20[
[1] 12
Możemy także odwołać się do większego zakresu:
3:5] wart_10_20[
[1] 12 13 14
I wybranych elementów:
c(1,3,5)] wart_10_20[
[1] 10 12 14
W ten sposób można także modyfikować odpowiednie elementy wektora:
7] <- 90 wart_10_20[
Wybór obserwacji większych od 15:
>15] wart_10_20[wart_10_20
[1] 90 17 18 19 20
Z kolei następujący zapis zwróci nam wektor wartości logicznych:
> 15 wart_10_20
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
Brak danych w R jest przedstawiany jako wartość NA
(ang. not available) i może powodować trudności z wywoływaniem niektórych funkcji:
<- c(1,2,1,NA,1)
v_na v_na
[1] 1 2 1 NA 1
sum(v_na)
[1] NA
W związku z tym większość funkcji ma zaimplementowany dodatkowy argument służący do obsługi tego typu wartości, który najczęściej nie uwzględnia tych wartości w obliczeniach:
sum(v_na, na.rm = TRUE)
[1] 5
Oprócz braku danych podczas obliczeń możemy natrafić na wartości nieokreślone NaN
(ang. not a number) oraz nieskończone Inf
(ang. infinity).
0/0
[1] NaN
1/0
[1] Inf
sqrt(-10)
Warning in sqrt(-10): NaNs produced
[1] NaN
W R istnieje także wartość NULL
, która jest podstawowym typem danych a nie wartością. NULL
można traktować jako odpowiednik zbioru pustego. Jest stosowany np. w funkcjach, które niczego nie zwracają.
<- c(1,2,1,NULL,1)
v_null v_null
[1] 1 2 1 1
sum(v_null)
[1] 5
12, 5, 20, 18, 8.5, 10, 4, 101, -2
?seq
i na podstawie wektora … dokonaj przekształcenia tworząc następujący wektor: 2 0 0 4 0 0 6 0 0 8 0 0
.2, 3, 7, 8, 2
, b: 9, 1, 2, 0, 2
. Jakiego typu będzie wektor będący wynikiem działania a<=b
?letters
o polskie litery diakrytyzowane. Jaką długość ma nowo utworzony wektor?Macierze są wykorzystywane w R do przechowywania np. odległości pomiędzy punktami czy wskazywania sąsiedztwa obszarów geograficznych.
Do tworzenia macierzy służy funkcja matrix
:
<- matrix(1:6, nrow = 2, ncol=3)
m m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
Z wykorzystaniem wybranych funkcji można sprawdzić wymiary macierzy, liczbę wierszy oraz kolumn:
dim(m)
[1] 2 3
ncol(m)
[1] 3
nrow(m)
[1] 2
Macierz może także zawierać tekst:
matrix(letters[1:9], nrow=3)
[,1] [,2] [,3]
[1,] "a" "d" "g"
[2,] "b" "e" "h"
[3,] "c" "f" "i"
Domyślnie macierz układana jest kolumnami. Aby to zmienić należy dodać argument byrow=TRUE
:
matrix(letters[1:9], nrow=3, byrow=TRUE)
[,1] [,2] [,3]
[1,] "a" "b" "c"
[2,] "d" "e" "f"
[3,] "g" "h" "i"
Jeśli liczba elementów wejściowych jest mniejsza iloczyn podanej liczby kolumn i wierszy to w brakujące miejsce wstawiane są elementy z początku wektora wejściowego:
matrix(letters[1:7], nrow=3, byrow=TRUE)
Warning in matrix(letters[1:7], nrow = 3, byrow = TRUE): data length [7] is not
a sub-multiple or multiple of the number of rows [3]
[,1] [,2] [,3]
[1,] "a" "b" "c"
[2,] "d" "e" "f"
[3,] "g" "a" "b"
Z kolei macierz diagnonalną posiadającą elementy niezerowe wyłącznie na przekątnej tworzy się z wykorzystaniem funkcji diag
. Macierz jednostkowa o wymiarach
diag(4)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
Macierz diagonalna o wartościach 5 na przekątnej i wymiarach
diag(5, nrow=3, ncol=3)
[,1] [,2] [,3]
[1,] 5 0 0
[2,] 0 5 0
[3,] 0 0 5
Funkcja diag
umożliwia także ekstrakcję przekątnej z istniejącej już macierzy:
diag(matrix(letters[1:9], nrow=3))
[1] "a" "e" "i"
Z wykorzystaniem funkcji rbind
i cbind
można odpowiednio łączyć obiekty wierszami (ang. row bind) lub kolumnami (ang. col bind):
rbind(m, c(99, 88, 77))
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[3,] 99 88 77
cbind(m, matrix(101:104, nrow=2))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 101 103
[2,] 2 4 6 102 104
Dostęp do poszczególnych elementów macierzy odbywa się z wykorzystaniem nawiasów kwadratowych, ale można podać dwie wartość - obiekt[wiersz,kolumna]
:
2,1] # drugi wiersz, pierwsza kolumna m[
[1] 2
2,] # tylko drugi wiersz m[
[1] 2 4 6
1] # tylko pierwsza kolumna m[,
[1] 1 2
# wszystkie obserwacje m[,]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
# wszystkie obserwacje m[]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
W ten sposób można dokonać modyfikacji konkretnych elementów macierzy:
2,1] <- 77
m[ m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 77 4 6
Na macierzach można wywołać szereg operacji:
Operator/funkcja | Działanie |
---|---|
a %*% b | mnożenie macierzy a i b |
t(a) | transpozycja macierzy a |
det(a) | wyznacznik macierzy a |
solve(a) | macierz odwrotna z a |
solve(a, b) | rozwiązanie układu a*x=b |
Rozważmy dwie macierze:
<- matrix(c(2, 3, 4, 2, 1, 2, 1, 3, 2), nrow = 3)
a <- matrix(6:1, ncol=2)
b a;b
[,1] [,2] [,3]
[1,] 2 2 1
[2,] 3 1 3
[3,] 4 2 2
[,1] [,2]
[1,] 6 3
[2,] 5 2
[3,] 4 1
Aby przeprowadzić mnożenie macierzy a
i b
, liczba kolumn macierzy a
musi być równa liczbie wierszy w macierzy b
. Z kolei rozmiar macierzy wyjściowej to liczba wierszy macierzy a
i liczba kolumn macierzy b
.
%*% b a
[,1] [,2]
[1,] 26 11
[2,] 35 14
[3,] 42 18
Transpozycja macierzy b
:
t(b)
[,1] [,2] [,3]
[1,] 6 5 4
[2,] 3 2 1
Wyznacznik macierzy a
:
det(a)
[1] 6
Macierz odwrotna do macierzy a
:
solve(a)
[,1] [,2] [,3]
[1,] -0.6666667 -0.3333333 0.8333333
[2,] 1.0000000 0.0000000 -0.5000000
[3,] 0.3333333 0.6666667 -0.6666667
Wyznaczenie macierzy x
w równaniu a*x=b
:
solve(a,b)
[,1] [,2]
[1,] -2.333333 -1.833333
[2,] 4.000000 2.500000
[3,] 2.666667 1.666667
%*% solve(a,b) a
[,1] [,2]
[1,] 6 3
[2,] 5 2
[3,] 4 1
b
[,1] [,2]
[1,] 6 3
[2,] 5 2
[3,] 4 1
Zmienna 2,4,1,6,9,3,2,9,10,7
, zmienna 1.5,0.2,0.1,2,3.1,1.2,0.4,2.9,2.5,1.9
, a zmienna 12,15,10,19,26,13,13,21,29,18
. Wyznacz wartość
<- matrix(1:4, nrow=2)
zad1 solve(zad1)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
%*% solve(zad1) zad1
[,1] [,2]
[1,] 1 0
[2,] 0 1
Czynnik (ang. factor) służy do przechowywania danych jakościowych o mało licznej liczbie kategorii, mierzonych na skali nominalnej i porządkowej.
Rozważmy informacje o wykształceniu:
<- rep(c("podstawowe", "średnie", "wyższe"), c(5,3,2))
wyk wyk
[1] "podstawowe" "podstawowe" "podstawowe" "podstawowe" "podstawowe"
[6] "średnie" "średnie" "średnie" "wyższe" "wyższe"
i dokonajmy transformacji na czynnik:
<- factor(wyk)
wyk_f wyk_f
[1] podstawowe podstawowe podstawowe podstawowe podstawowe średnie
[7] średnie średnie wyższe wyższe
Levels: podstawowe średnie wyższe
Funkcja summary()
wywołana na czynniku zwraca wynik innego typu aniżeli na wektorze tekstowym:
summary(wyk)
Length Class Mode
10 character character
summary(wyk_f)
podstawowe średnie wyższe
5 3 2
Jeśli chcemy zaakcentować fakt, że zmienne są mierzone na skali porządkowej dodajemy argument ordered=TRUE
:
<- factor(wyk, ordered = TRUE)
wyk_of wyk_of
[1] podstawowe podstawowe podstawowe podstawowe podstawowe średnie
[7] średnie średnie wyższe wyższe
Levels: podstawowe < średnie < wyższe
W łatwy sposób możemy edytować etykiety:
levels(wyk_of) <- c("pod.", "śr.", "wyż.")
wyk_of
[1] pod. pod. pod. pod. pod. śr. śr. śr. wyż. wyż.
Levels: pod. < śr. < wyż.
Czynniki mają szczególne znaczenie w przypadku tworzenia wykresów, gdy chcemy określić porządek wyświetlania.
Listy to ciągi złożone z elementów o dowolnych typach. Mogą przydać się w szczególności przy budowaniu funkcji, które zwracają tylko jedną wartość. Wówczas dane różnego typu mogą być zawarte w takiej liście.
Tworzenie prostej listy:
<- list(TRUE, c(1,2,3,4), "element tekstowy")
l l
[[1]]
[1] TRUE
[[2]]
[1] 1 2 3 4
[[3]]
[1] "element tekstowy"
Już na pierwszy rzut oka widać bardziej złożoną strukturę listy. W związku z tym odwoływanie do poszczególnych elementów będzie trochę się różnić od wektorów czy macierzy.
2] # druga lista l[
[[1]]
[1] 1 2 3 4
2]] # zawartość listy l[[
[1] 1 2 3 4
2]][3] # trzeci element wektora drugiej listy l[[
[1] 3
Listę można także rozwinąć do wektora z wykorzystaniem funkcji unlist
:
unlist(l)
[1] "TRUE" "1" "2" "3"
[5] "4" "element tekstowy"
Poszczególne elementy listy można nazwać:
<- list(log=TRUE, num=c(1,2,3,4), tekst="element tekstowy")
ln ln
$log
[1] TRUE
$num
[1] 1 2 3 4
$tekst
[1] "element tekstowy"
Wówczas można uzyskać do nich dostęp poprzez symbol $
i podaną nazwę:
$num ln
[1] 1 2 3 4
2]] # normalne indeksowanie nadal działa ln[[
[1] 1 2 3 4
$num[2] ln
[1] 2
Ramka danych to tabela, która przypomina tą z Excela zawierająca dane o różnych typach. Tworzona za pomocą funkcji data.frame
:
<- data.frame(plec=c("m", "k", "k", "m", "k", "m", "m", "m"),
df wzrost=c(173, 170, 163, 178, 169, 180, 175, NA),
pali=c(T, F, F, F, T, F, NA, T))
W RStudio po wybraniu tego obiektu w zakładce Environment
pojawia się przyjazne okno do przeglądania oraz poglądowego filtrowania i sortowania danych ze zbioru.
Możemy zobaczyć podsumowanie całego zbioru wywołując na nim funkcję summary()
:
summary(df)
plec wzrost pali
Length:8 Min. :163.0 Mode :logical
Class :character 1st Qu.:169.5 FALSE:4
Mode :character Median :173.0 TRUE :3
Mean :172.6 NA's :1
3rd Qu.:176.5
Max. :180.0
NA's :1
Ramki danych można indeksować w taki sam sposób jak macierze lub z wykorzystaniem operatora $
:
2] # druga kolumna df[,
[1] 173 170 163 178 169 180 175 NA
$wzrost # kolumna wzrost df
[1] 173 170 163 178 169 180 175 NA
c("plec", "pali")] df[,
plec pali
1 m TRUE
2 k FALSE
3 k FALSE
4 m FALSE
5 k TRUE
6 m FALSE
7 m NA
8 m TRUE
Z kolei do wyboru obserwacji można wykorzystać warunek:
$plec=="m",] df[df
plec wzrost pali
1 m 173 TRUE
4 m 178 FALSE
6 m 180 FALSE
7 m 175 NA
8 m NA TRUE
Wyodrębnienie informacji o wzroście tylko dla kobiet i wyznaczenie średniej:
<- df$wzrost[df$plec == "k"]
wzrost_k wzrost_k
[1] 170 163 169
mean(wzrost_k)
[1] 167.3333
Widzimy, że dla mężczyzn nie udało się ustalić wszystkich informacji i jeden z nich nie ma podanego wzrostu, a dla drugiego brakuje informacji o paleniu papierosów. Możemy usunąć braki danych w kolumnach korzystając z funkcji complete.cases()
:
complete.cases(df$wzrost),] # tylko zmienna wzrost df[
plec wzrost pali
1 m 173 TRUE
2 k 170 FALSE
3 k 163 FALSE
4 m 178 FALSE
5 k 169 TRUE
6 m 180 FALSE
7 m 175 NA
complete.cases(df),] # wszystkie zmienne df[
plec wzrost pali
1 m 173 TRUE
2 k 170 FALSE
3 k 163 FALSE
4 m 178 FALSE
5 k 169 TRUE
6 m 180 FALSE
Zbiory danych przechowywane są także w R i pochodzą z różnych pakietów. Wywołując funkcję data("zbior")
ładujemy dany zbiór do pamięci. Do szybkiego podglądu zebranych danych służy funkcja head()
, która domyślnie wyświetla 6 pierwszych obserwacji ze zbioru:
data("iris")
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
Załaduj do pamięci zbiór o nazwie ChickWeight.