Podstawowe operacje w R

Agata Rokita

Opublikowano Tue Nov 01 23:39:55 2022

1 Rodzaje struktur danych

1.1 Wektory

Zadanie 1. Utwórz wektor danych “wiek” (w latach). Każdy z nich ma mieć 10 obserwacji, dowolne wartości.

wiek <- c(15,25,40,50,60,23,33,36,19,24)
wiek
##  [1] 15 25 40 50 60 23 33 36 19 24

1.2 Czynnik

Zadanie 2. Utwórz wektor ryzyko jako czynnik (factor): dla wieku >30 lat “0” o etykiecie “wysokie”, a dla pozostałych “1” o etykiecie “niskie”. Wskazówka: można wykorzystać ifelse.

ryzyko <- as.factor(ifelse(wiek > 30, c("wysokie"), c("niskie")))
ryzyko
##  [1] niskie  niskie  wysokie wysokie wysokie niskie  wysokie wysokie niskie 
## [10] niskie 
## Levels: niskie wysokie

1.3 Ramka danych

Zadanie 3. Połącz wiek i ryzyko tworząc nową ramkę danych o nazwie “ramka”. Posortuj obserwacje wg wieku (malejąco).

ramka <- data.frame(cbind(wiek, ryzyko)[order(wiek, decreasing = TRUE), ])
ramka
##    wiek ryzyko
## 1    60      2
## 2    50      2
## 3    40      2
## 4    36      2
## 5    33      2
## 6    25      1
## 7    24      1
## 8    23      1
## 9    19      1
## 10   15      1
knitr::kable(ramka, format="html")
wiek ryzyko
60 2
50 2
40 2
36 2
33 2
25 1
24 1
23 1
19 1
15 1

1.4 Tablice

Zadanie 4. Utwórz tablicę “tablica” z wieku i ryzyka o wymiarach 5 wierszy, 2 kolumny (zmienne), 2 podgrupy o nazwie “Grupa 1.” oraz “Grupa 2”.

grupy <- c("Grupa 1", "Grupa 2")
kolumny <- c("Wiek", "Ryzyko")
tablica <- array(data = c(unlist(ramka[1:5,]), unlist(ramka[6:10,])), dim = c(5,2,2), dimnames = list(NULL,kolumny,grupy))
tablica
## , , Grupa 1
## 
##      Wiek Ryzyko
## [1,]   60      2
## [2,]   50      2
## [3,]   40      2
## [4,]   36      2
## [5,]   33      2
## 
## , , Grupa 2
## 
##      Wiek Ryzyko
## [1,]   25      1
## [2,]   24      1
## [3,]   23      1
## [4,]   19      1
## [5,]   15      1

Zadanie dodatkowe. Dla trzeciej osoby w drugiej grupie czytaj wiek i ryzyko.

print(tablica[3, ,2])
##   Wiek Ryzyko 
##     23      1

1.5 Listy

Zadanie 5. Utwórz listę “lista” zawierającą pierwsze 3 elementy każdej z grup w tablicy “tablica” oraz 3 kolory które najbardziej lubisz.

lista <- list(tablica[1:3,,1:2], c("czarny", "bordowy", "zielony"))
lista
## [[1]]
## , , Grupa 1
## 
##      Wiek Ryzyko
## [1,]   60      2
## [2,]   50      2
## [3,]   40      2
## 
## , , Grupa 2
## 
##      Wiek Ryzyko
## [1,]   25      1
## [2,]   24      1
## [3,]   23      1
## 
## 
## [[2]]
## [1] "czarny"  "bordowy" "zielony"

1.6 Macierze

Zadanie 6. Utwórz macierz kwadratową B z cyfr od 1 do 9; macierz kwadratową A 2x3 z cyfr od 1 do 6; macierz C 3x2 z cyfr od 1 do 6. Dodaj do macierzy A wiersz [1,1,1] jako macierz D oraz do macierzy C kolumnę [1,1,1] jako macierz E. Wyświetl tylko trzeci wiersz macierzy E i trzecią kolumnę macierzy D.

B <- matrix(1:9, nrow=3, ncol=3)
A <- matrix(1:6, nrow=2, ncol=3)
C <- matrix(1:6, nrow=3, ncol=2)
D <- rbind(A, c(1,1,1))
E <- cbind(C, c(1,1,1))

Trzeci wiersz macierzy E

E[3,]
## [1] 3 6 1

Trzecia kolumna macierzy D

D[,3]
## [1] 5 6 1

2 Analiza opisowa

Zadanie 7. Dokonaj pełnej analizy opisowej dla osób z grupy 1. oraz grupy 2. (średnia, odchylenia, kwartyle, skośność, kurtoza).

library(ggplot2)
library(moments)
library(e1071)
library(data.table)

Grupa <- ryzyko <- factor(ifelse(wiek > 30, c("wysokie"), c("niskie")))
ramka2 <- data.frame(cbind(wiek, Grupa)[order(wiek, decreasing = TRUE), ])

#średnia arytmetyczna i kwartyle
setDT(ramka2)
średnia_i_kwartyle <- ramka2[, as.list(summary(wiek)), by = Grupa]
colnames(średnia_i_kwartyle) <- c("Grupa","Minimum","Kwartyl 1.","Mediana","Średnia arytmetyczna","Kwartyl 3.","Maksimum")

#odchylenie standardowe
odchylenie_standardowe <- ramka2[, as.list(sd(wiek)), by = Grupa]
colnames(odchylenie_standardowe) <- c("Grupa","Odchylenie standardowe")

#wariancja
wariancja <- ramka2[, as.list(var(wiek)), by = Grupa]
colnames(wariancja) <- c("Grupa","Wariancja")

#kurtoza
kurtoza <- ramka2[, as.list(kurtosis(wiek)), by = Grupa]
colnames(kurtoza) <- c("Grupa","Kurtoza")

#skośność
skośność <- ramka2[, as.list(skewness(wiek)), by = Grupa]
colnames(skośność) <- c("Grupa","Skośność")

dt <- Reduce(merge,list(średnia_i_kwartyle, odchylenie_standardowe, wariancja, kurtoza, skośność))
dt <- transpose(dt, fill=NA, ignore.empty=FALSE, keep.names="NULL", make.names=NULL)
colnames(dt) <- c("Analiza Opisowa", "Grupa 1", "Grupa 2")

new_dt <- dt[-c(1), ]
new_dt
##            Analiza Opisowa   Grupa 1    Grupa 2
##  1:                Minimum 15.000000  33.000000
##  2:             Kwartyl 1. 19.000000  36.000000
##  3:                Mediana 23.000000  40.000000
##  4:   Średnia arytmetyczna 21.200000  43.800000
##  5:             Kwartyl 3. 24.000000  50.000000
##  6:               Maksimum 25.000000  60.000000
##  7: Odchylenie standardowe  4.147288  11.099550
##  8:              Wariancja 17.200000 123.200000
##  9:                Kurtoza -1.795608  -1.842194
## 10:               Skośność -0.466318   0.394997
knitr::kable(new_dt, format="html")
Analiza Opisowa Grupa 1 Grupa 2
Minimum 15.000000 33.000000
Kwartyl 1. 19.000000 36.000000
Mediana 23.000000 40.000000
Średnia arytmetyczna 21.200000 43.800000
Kwartyl 3. 24.000000 50.000000
Maksimum 25.000000 60.000000
Odchylenie standardowe 4.147288 11.099550
Wariancja 17.200000 123.200000
Kurtoza -1.795608 -1.842194
Skośność -0.466318 0.394997

Zadanie 8. Przedstaw na histogramach oraz wykresach ramkowych rozkłady wieku osób z wysokim i niskim ryzykiem kredytowym (porównanie - 2 wykresy obok siebie).

Histogramy

library(ggplot2)
dane1 <- data.frame(ramka[1:5,])
dane2 <- data.frame(ramka[6:10,])

wiek1 <- dane1$wiek
wiek2 <- dane2$wiek

#dwie kolumny
par(mfrow=c(1,2))

#histogram dla grupy 1
histogram1 <- hist(wiek1, main="Histogram dla wysokiego ryzyka", 
xlab="Wiek", xlim=c(30,60),
ylab="Gęstość",
col="darkmagenta",
freq=TRUE)

#histogram dla grupy 2
histogram2 <- hist(wiek2, main="Histogram dla niskiego ryzyka",
xlab="Wiek", xlim=c(15,25),
ylab="Gęstość",
col="grey",
freq=TRUE)

Wykresy ramkowe

par(mfrow=c(1,2))

#wykres ramkowy dla grupy 1
wykres1 <- boxplot(wiek1, data=airquality,
main="Wiek wysokiego ryzyka", xlab="Ryzyko wysokie", ylab="Wiek",
col="lightgreen", border="darkmagenta")

#wykres ramkowy dla grupy 2
wykres2 <- boxplot(wiek2, data=airquality,
main="Wiek niskiego ryzyka", xlab="Ryzyko niskie", ylab="Wiek",
col="grey",border="darkmagenta")

3 Fajki

3.1 Fajka bazowa

Przykład. Dane dotyczą prawie 985 transakcji sprzedaży mieszkań z Sacramento (Kalifornia,USA). Poniżej pokazano przykład wykorzystania fajki bazowej R “|>”: wykres logarytmu gęstości cen.

price |> 
  log() |>
  density() |>
  plot()

3.2 Fajka %>%

Przykład. Wykreśl histogram cen sprzedaży mieszkań (“Condo”) z dwiema sypialniami.

Filtry z dplyr działają na całej ramce danych, stąd by wykreślić ceny musimy użyć pakietu ggplot2:

dane %>%
  filter(type=="Condo" & beds==2) %>%
  ggplot(aes(price)) +
  geom_histogram(bins=8)

Bez użycia filtra i fajek nie ma takiej potrzeby: