KSAP / Podstawy programowania w R -...
Transcript of KSAP / Podstawy programowania w R -...
1 Pierwszy skrypt
Celem tego punktu jest stworzenie pierwszego skrypu, który zawiera typowe kroki do ana-
lizy danych: wczytania danych, wykonania analizy, zapisania wyników przeprowadzonej
analizy.
1.1 Prosta analiza danych – stworzenie histogramu
Poniżej jest przykład prostego skryptu obrazującego wykorzystanie funkcji hist(). Skrypt
składa się z dwóch elementów: (a) stworzenia danych; (b) stworzenia wykresu
1 ### Tworzenie danych
2 n <- 10^4
3 x <- rnorm( n, 0, 1)
4
5 ### Tworzenie prostego wykresu
6 hist( x, freq = FALSE ,
7 col = "#AAFFCC",
8 main = "To␣jest␣tytul",
9 xlab = "napis␣na␣dole",
10 ylab = "napis␣z␣boku")
11 grid()
12 lines( density( x), col = "red",
13 lwd = 2,
14 lty = "dashed" )
1.2 Zapisywanie i wczytywanie danych
1.2.1 Zapisywanie wykresów do pliku
Poniższy skrypt pokazuje w jaki sposób można zapisać wykresy do plików graficznych.
1 ### Tworzenie danych
2 n <- 10^4
3
3 x <- rnorm( n, 0, 1)
4
5 ### Otwieranie pliku
6 png( file = "rys1.png")
7
8 ### Tworzenie prostego wykresu
9 hist( x, freq = FALSE ,
10 col = "yellow",
11 main = "To␣jest␣tytul",
12 xlab = "napis␣na␣dole",
13 ylab = "napis␣z␣boku")
14 grid()
15 lines( density( x), col = "red",
16 lwd = 2,
17 lty = "dashed" )
18
19 ### Zamykanie pliku
20 dev.off()
W powyższym skrypcie ważne aby każde wywołanie funkcji png() było zakończone wywo-
łaniem funkcji dev.off(). Wszystko to, co ma znaleźć się w pliku musi zostać obliczone
po wywołaniu funkcji png() a przed wywołaniem funkcji dev.off().
1.2.2 Zapisywanie danych liczbowy do pliku CSV
1 ### Tworzenie przykladowych danych
2 n <- 10 # liczba wierszy
3 dane <- data.frame( "kolumna␣A" = rnorm( n, 0, 1), "kolumna␣B" = rbinom(
n, 10, .5))
4
5 ### Zapisywanie danych
6 write.csv2( file = "dane.csv", dane)
1.2.3 Wczytywanie danych z pliku CSV
1 ### Wczytywanie danych
4
2 d <- read.csv2( file = "dane.csv")
3
4 ### Wykorzystanie wczytanych danych
5 mean( d$kolumna.A)
6 mean( d$kolumna.B)
1.3 Obsługa plików XLSX
1.3.1 Wczytywanie
1 ### Wgranie pakietow
2 require( readxl)
3
4 ### Sprawdzenie listy skoroszytow
5 zeszyty <- excel_sheets( path = "./dane.xlsx")
6 zeszyty
7
8 ### Wgranie skoroszytow
9 dane1 <- read_excel( path = "./dane.xlsx", sheet = zeszyty [1])
10 dane2 <- read_excel( path = "./dane.xlsx", sheet = zeszyty [2])
11
12 dane1
13 head( dane2)
14 dane1$dane
15 dane2$wymiar
1.3.2 Zapisywanie
1 ### Tworzenie danych
2 data <- data.frame(
3 "pozycja" = 1:10,
4 "wartosc" = rnorm (10, 0, 1)
5 )
6 data
7
8 ### Wczytanie pakietu
9 require( xlsx)
5
10
11 ### Gdyby to dzialalo to mozna zapisac do XLSX
2 Struktury danych (podstawowe)
2.1 Wektory
Wektory to podstawowa struktura danych w R. Poniższy skrypt pokazuje podstawowe
tworzenie wektorów, podstawowe operacje na wetkorach i przykładowe wykorzystanie.
1 ### Tworzenie wektorow
2 x <- c( 123, 11, 34, 56)
3 x
4 y <- rnorm (100)
5 y
6
7 ### Funkcje do generowania wektorow
8 1:10
9 1.1:10
10 -5:5
11 5:-5
12
13 seq( 0, 1, 0.1)
14 seq( 0, 1, length.out = 13)
15
16 rep( 1:3, 5)
17
18 ### Dzialania na wektorach
19 x <- 1:5
20 x
21 length( x)
22 sort( x)
23 sample( x)
24 min(x)
25 max( x)
26 range( x)
6
27
28 x^2
29 x/2
30 log( x)
31 2*x
32
33 x
34 y <- sample( x)
35 y
36
37 ### Dodawanie wektorow i recycling rule
38 a <- c(1, 2, 3, 4)
39 a + c(0,1)
40
41 ### 1 2 3 4
42 ### 0 1 0 1
43 ### 1 3 3 5
44
45 ### Przykladowe wykorzystanie do stworzenia wykresu kwartalnego
46 n <- 100
47 dane <- rnorm(n * 4) + c(1,2,3,4)
48
49 plot(x = jitter( rep(1:4, n)),
50 y = dane ,
51 pch = 20,
52 type = "p",
53 col = rgb(1, 0, 0, .5)
54 )
55
56 abline( v = 1:3+.5 , lty = "dashed")
57
58 ### Typy przechowywane w wekorze: dowolne ale tylko jeden na raz
59 c(1,5,6)
60 c(1,5,6, "ala")
Drugą ważną sprawą jest indeksowanie wektorów.
1 ### Tworzenie przykladowego wektora
7
2 x <- 5:1
3 x
4
5 ### Indeksowanie przez podanie pozycji
6 x[1]
7 x[4]
8 x[c(1,4)]
9 x[c(4,1)]
10 x[c(1,1,1,4,4,4,4,1,1,1,4,4,4,1,1,1)]
11 y <- x[1:3] # zapisanie wyniku selekcji w nowej zmiennej
12 x[2:4]
13 x[rbinom( 10, 4, .5)+1]
14 x[0] # to nie istnieje , pozycje sa numerowane od 1
15
16 dir() [1:4]
17
18 ### Indeksowanie przez podanie wektora logicznego
19 TRUE
20 FALSE
21
22 ind <- c( TRUE , FALSE , TRUE)
23 ind
24 x <- c(6, 3, 2)
25 x
26 x[ind]
27
28 x[x > 2]
29
30 x <- rnorm( 30, 0, 1)
31 mean( x[x > 0])
32 mean( x[x < 0])
33
34 ### Przyklad
35 area <- rnorm(10, 100, 50)
36 area
37 res <- rnorm( 10, 10, 1)
38 res
39
8
40 mean( res[area > 100])
41 mean( res[area < 100])
42
43 ### Przyklad
44 x <- rnorm (100, 0, 1)
45 x
46 x[x>0 & x<1]
47 x[x < -1 | x > 1]
48
49 ### Przyklad
50 n <- 20
51 area <- rnorm( n, 100, 50)
52 area
53 res <- rnorm( n, 0, 10)
54 res
55 nazwa <- replicate( n, paste( sample( letters , 10), collapse = ""))
56 nazwa
57
58 duzeObszary <- area > 100
59 deficyt <- res < 0
60
61 nazwa[duzeObszary & deficyt]
62 nazwa[!duzeObszary & deficyt]
63
64 res[duzeObszary & deficyt]
65
66 barplot(
67 height = - res[duzeObszary & deficyt],
68 names.arg = nazwa[duzeObszary & deficyt],
69 horiz = FALSE)
70
71 ### Indeksowanie przez nazwe
72 x <- c(100, 200, 150)
73 names( x) <- c("powiat␣1", "powiat␣2", "powiat␣3")
74 x
75 x["powiat␣2"]
9
2.2 Listy
Listy są drugą podstawową strukturą danych w R. Jest to również często podstawa do
konstruowania obiektów w modelu S3.
1 ### Tworzenie podstawowych list
2 x <- list( powiatid = "id83756", powierzchnia = 230, ludnosc = 30)
3 x
4
5 ### Selekcja z listy po nazwie slotu
6 x$powiatid
7 x$powierzchnia
8
9 ### Jak sie dodaje sloty?
10 x <- c( x, list( smog = TRUE))
11 x
12
13 ### Jak sie usuwa sloty? / Jak sie zmienia wartosci na slotach?
14 x$smog <- NULL
15 x
16 x$ludnosc <- 50
17 x
18
19 ### Indeksowanie przez podanie pozycji slotu
20 x[1] # zwraca liste
21 x[[1]] # zwraca wartosc slotu
2.3 Ramki danych
Z technicznego punktu widzenia ramka danych to lista ale jest ona inaczej interpretowana.
Poniżej jest przykład pracy ramkami danych.
1 ### Tworzenie ramki danych
2 n <- 20
3 dane <- data.frame(
4 nazwa = replicate( n, paste0( sample( letters , 5), collapse = "")),
10
5 powierzchnia = rnorm( n, 100, 50),
6 ludnosc = rnorm( n, 10000 , 3000)
7 )
8 head( dane)
9 typeof( dane)
10
11 ### Dodawanie kolumny
12 dane <- cbind(
13 dane ,
14 data.frame( deficyt = rnorm( n, 0, 30))
15 )
16 head( dane)
17
18 noweDane <- data.frame(
19 nazwa = replicate( n, paste0( sample( letters , 5), collapse = "")),
20 powierzchnia = rnorm( n, 100, 50),
21 ludnosc = rnorm( n, 10000 , 3000),
22 deficyt = rnorm( n, 0, 30)
23 )
24
25 dane <- rbind( dane , noweDane)
26 dane
27
28 ### Indeksowanie ramki danych
29 names( dane)
30 dane$ludnosc
31 dane$deficyt
32
33 dane [1:10 , ]
34 dane[c(1, 10, 20), ]
35 dane[c(1, 10, 20), c(1, 3)]
36 dane[c(1, 10, 20), c(1, 3, 4)]
37 dane[c(1, 10, 20), c( "ludnosc", "deficyt")]
38 dane[ dane$deficyt < 0 & dane$ludnosc > 13000, ]
39 dane[ dane$deficyt < 0 | dane$ludnosc > 13000, ]
40
41 zbior1 <- dane[ dane$deficyt < 0 & dane$ludnosc > 13000 , ]
42 barplot( height = zbior1$deficyt , names.arg = zbior1$nazwa ,
11
43 density = 20, angle = 45)
Proste wykorzystanie modelu regresji liniowej. Model wykorzystuje dane zapisane w ramce
danych i zwraca wynik w postaci listy.
1 ### Wgranie danych
2 data( cars)
3 head( cars)
4 names( cars)
5 ls()
6 ### rm( list = ls())
7
8 plot( cars , pch = 20)
9 model <- lm( dist ~ +1 +speed , data = cars)
10 summary( model)
11 abline( model , lwd = 2)
12
13 model2 <- lm( dist ~ -1 +I(speed ^2), data = cars)
14 summary( model2)
15 plot( cars , pch = 20)
16 x <- seq( min(cars$speed), max(cars$speed), 1)
17 y <- model2$coefficients * x^2
18 lines( x = x, y = y, col = "red")
3 Kontrolowanie wykonania programu
3.1 Wykonania warunkowe
Najprostsza kontrola wykonywania programu to zastosowanie konstrukcji if(){}. Poniżej
przykład zastosowania takiej konstrukcji.
1 ### Proste wykonanie warunkowe / blok kodu
2 x <- -5
3 if( x > 0 ){
4 print( "Zmienna␣x␣jest␣dodatnia")
12
5 }
6
7 ### Bardziej skomplikowany warunek
8 x <- 3
9 y <- 3
10 if( x > 0 & y > 0 ){
11 print( "Zmienna␣x␣jest␣dodatnia␣i␣zmienna␣y␣tez␣jest␣dodatnia")
12 }
13
14 x <- 3
15 y <- -3
16 if( x > 0 | y > 0 ){
17 print( "Warunek␣jest␣spelniony")
18 }
19
20 x <- -3
21 y <- -3
22 if( !(x > 0 | y > 0) ){
23 print( "Warunek␣jest␣spelniony")
24 }
25
26 ### Uwaga , ponizsza konstrukcja nie jest bezpieczna
27 x <- 2
28 if( x == 2L ){
29 print( "Warunek␣jest␣spelniony")
30 }
31
32 ### Konstrukcja znacznie bezpieczniejsza
33 x <- 2L
34 if( identical( x, 2L) ){
35 print( "Warunek␣jest␣spelniony")
36 }
37
38 ### Porownanie wektorow
39 x <- c(1, 2)
40 y <- c(1, 2, 3)
41 if( x == y){
42 print( "Warunek␣jest␣spelniony")
13
43 }
44
45 if( identical( x, y)){
46 print( "Warunek␣jest␣spelniony")
47 }
Warunek z alternatywą
1 ### Prosta konstrukcja warunku z alternatywa
2 x <- -2
3 if( x > 0){
4 print( "Zmienna␣x␣jest␣dodatnia")
5 } else {
6 print( "Zmienna␣x␣nie␣jest␣dodatnia")
7 }
Warunek, który pozwala obsłużyć wiele możliwości.
1 ### Pierwsza metoda
2 x <- 3
3 switch( x,
4 { print( "To␣jest␣blok␣1")},
5 { print( "To␣jest␣blok␣2")},
6 { print( "To␣jest␣blok␣3")}
7 )
8
9 ### Druga metoda
10 x <- "alert"
11 switch( x,
12 "normalna" = { print( "Kod␣osluguje␣sytuacje␣normalna")},
13 "nietypowa"= { print( "Kod␣obsluguje␣sytuacje␣nietypowa")},
14 "alert" = { print( "Tutaj␣cos␣sie␣sypie")}
15 )
Wektorowe warsja if() to funkcja ifelse(), która jest znacznie szybsza.
1 ### Podstawowe wykorzystanie
2 x <- rnorm( 20)
3 y <- rep( 0, length( x))
14
4 ifelse( x > 0, x, y)
5
6 ### T T T F F T F
7 ### x x x x x x x
8 ### y y y y y y y
9 ### x x x y y x y
3.2 Pętle
Najprostsza pętla to pętla for(){}. Poniżej przykład wykorzystania takiej pętli.
1 ### Proste wywolanie for(){}
2 for( k in 1:10){
3 print( k^2)
4 }
5
6 ### Iterowanie po znakach
7 for( a in letters){
8 cat( a)
9 }
10
11 ### Wypisanie wszystkich plikow w danych katalogu
12 for( plik in dir()){
13 print( plik)
14 }
Przykład. Skrypt, który w katalogu roboczym tworzy katalog dane, zmienia katalog ro-
boczy na katalog dane, tworzy tam 100 plików z losowymi danymi i o losowych nazwach
w formacie CSV, zmienia katalog roboczy na początkowy katalog roboczy.
1 ### Tworzenie katalogu zawierajacego dane
2 katalogDane <- "dane"
3 if( !dir.exists( katalogDane)){
4 dir.create( katalogDane)
5 }
6
7 ### Ustawianie nowego katalogu roboczego
15
8 oryginalnyKatalogRoboczy <- setwd( katalogDane)
9
10 ### Tworzenie losowych plikow z danymi
11 liczbaPlikow <- 100
12
13 for( k in 1: liczbaPlikow){
14
15 ## Tworzenie nazwy pliku
16 nazwaPliku <- paste0( "dane_", as.character( k), ".csv")
17
18 ## Tworzenie przykladowych danych
19 dane <- data.frame( "wartosci" = rnorm( 10))
20
21 ## Zapisywanie danych do pliku
22 write.csv( file = nazwaPliku , dane)
23
24 }
25
26 ### Ustawianie poczatkowego katalogu roboczego
27 setwd(oryginalnyKatalogRoboczy)
Przykład wykorzystujący stworzone powyżej dane. Zadanie polega na tym aby wczytać
zdane ze wszystkich plików i na tej podstawie stworzyć histogram.
1 ### Parametry skryptu
2 katalogDane <- "dane"
3
4 ### Ustawianie katalogu roboczego na katalog z danymi
5 oryginalnyKatalogRoboczy <- setwd( katalogDane)
6
7 ### Wczytanie danych
8 plikiDane <- list.files( pattern = ".csv") # wektor nazw plikow z danymi
9 wczytaneDane <- data.frame( c(), "wartosc" = c())
10 for( plik in plikiDane){
11 d <- read.csv( plik)
12 wczytaneDane <- rbind( wczytaneDane , d)
13 }
14
16
15 ### Powracanie do oryginalnego katalogu roboczego
16 setwd( oryginalnyKatalogRoboczy)
17
18 ### Analiza danych
19 hist( wczytaneDane$wartosci , freq = FALSE , angle = 45, density = 20,
20 main = "Analiza␣danych", xlab = "", ylab = "", xlim = c(-5,5))
21 lines( density( wczytaneDane$wartosci), col = "red", lwd = 2)
22 grid()
4 Funkcje
4.1 Podstawowa definicja funkcji
Aby zdefiniować funkcję wykorzystujemy konstrukcję postaci function(){}.
1 ### Definicja funkcji bez arguemntow
2 f1 <- function (){
3 print( "Hello␣world!")
4 }
5
6 ### Wywolanie funkcji
7 f1()
8
9 ### Definicja funkcji z jednym argumentem
10 f2 <- function( x){
11 x^2
12 }
13
14 ### Wywolanie funkcji
15 x <- f2( 13)
16 x
17
18 ### Definicja funkcji w wieloma argumentami
19 f3 <- function( x, y){
20 if ( x > 0 ){
17
21 return( x^y)
22 } else {
23 stop( "Funkcja␣jest␣zdefiniowana␣tylko␣dla␣dodatnich␣wartosc␣x"
)
24 }
25 }
26
27 ### Wywolanie
28 f3( 4, 1/2)
29 f3( 3, 2)
30 f3( -4, 1/2)
Poniżej prosty przykład funkcji, która jako argument przyjmuje inną funkcję.
1 ### Prosta funkcja do tworzenia wykresow innych funkcji
2 rysujWykres <- function( funkcja , dziedzina , liczbaPunktow){
3 x <- seq( min( dziedzina), max( dziedzina), length.out =
liczbaPunktow)
4 y <- funkcja( x)
5 plot( x = x, y = y)
6 }
7
8 rysujWykres( exp , c( -pi , pi), 100)
9
10 g <- function( x){ sin( x^2)}
11 rysujWykres( g, c( -pi , pi), 500)
4.2 Funkcje z domyślnymi wartościami argumentów
1 ### Prosta funkcja do tworzenia wykresow innych funkcji
2 rysujWykres <- function( funkcja , dziedzina , liczbaPunktow = 100){
3 x <- seq( min( dziedzina), max( dziedzina), length.out =
liczbaPunktow)
4 y <- funkcja( x)
5 plot( x = x, y = y)
6 }
7
18
8 g <- function( x){ sin( x^2)}
9 rysujWykres( g, c( -pi , pi), 500)
10 rysujWykres( g, c( -pi , pi))
4.3 Przekazywanie argumentów
1 ### Prosta funkcja do tworzenia wykresow innych funkcji
2 rysujWykres <- function( funkcja , dziedzina , liczbaPunktow = 100, ...){
3 x <- seq( min( dziedzina), max( dziedzina), length.out =
liczbaPunktow)
4 y <- funkcja( x)
5 plot( x = x, y = y, ...)
6 }
7
8 g <- function( x){ sin( x^2)}
9 rysujWykres( g, c( -pi , pi), 500)
10 rysujWykres( g, c( -pi , pi), 500, type = "o", pch = 20, col = "blue")
4.4 Wywoływanie funkcji
1 ### Prosta funkcja do tworzenia wykresow innych funkcji
2 rysujWykres <- function( funkcja , dziedzina , liczbaPunktow = 100, ...){
3 x <- seq( min( dziedzina), max( dziedzina), length.out =
liczbaPunktow)
4 y <- funkcja( x)
5 plot( x = x, y = y, ...)
6 }
7
8 g <- function( x){ sin( x^2)}
9 rysujWykres( g, c( -pi , pi), 500)
10 rysujWykres( g, c( -pi , pi), 500, type = "o", pch = 20, col = "blue")
11 rysujWykres( dziedzina = c( -pi, pi), liczbaPunktow = 500, funkcja = g)
4.5 Zmienne lokalne i globalne
1 ### Czyszczenie
2 rm( list = ls())
19
3 ls()
4
5 ### Zmienne globalne
6 x <- 10
7
8 ### Przyklad 1
9 f1 <- function (){
10 print( x)
11 }
12
13 f1()
14
15 ### Przyklad 2
16 f2 <- function( x){
17 print( x)
18 }
19
20 f2( x = 50)
21 x
22
23 ### Przyklad 3
24 f3 <- function (){
25 print( x)
26 x <- 300
27 print( x)
28 }
29
30 f3()
31 x
32
33 ### Przyklad 4
34 f4 <- function( x){
35 print( x)
36 x <- 700
37 print( x)
38 }
39
40 f4( x = x)
20
41 x
42
43 ### Przyklad 5 / Uwaga: ta konstrukcja nie jest bezpieczna!
44 f5 <- function (){
45 x <<- 999
46 }
47
48 x
49 f5()
50 x
5 Inne konstrukcje iterujące
1 ### Proste porownanie szybkosci
2 liczbaProb <- 10^5
3 dlugoscProby <- 10
4
5 ### Tworzenie przykladowych danych
6 dane <- matrix( rnorm( dlugoscProby * liczbaProb), dlugoscProby ,
liczbaProb)
7
8 ### Rozwiazanie 1
9 wyniki1 <- c()
10 system.time({
11 for (k in 1: liczbaProb){
12 wyniki1 <- c (wyniki1 , mean( dane[,k]))
13 }
14 })
15
16 ### Pierwsze podejscie do programowania funkcyjnego
17 system.time({
18 wyniki2 <- apply( X = dane , MARGIN = 2, FUN = mean)
19 })
20
21 identical( wyniki1 , wyniki2)
21
6 Przykładowe zastosowania
6.1 Prosta analiza dochodów
1 ### Ewentualna instalacja brakujacych pakietow
2 ### install.packages( "readxl ")
3
4 ### Wykorzystane biblioteki
5 require( readxl)
6
7 ### Ustawianie srodowiska pracy
8 Sys.setlocale("LC_CTYPE", "pl_PL")
9 ### setwd("H:/Zadania\ R")
10
11 ### Wczytanie danych
12 plikiDane <- dir()
13 dane <- read_xlsx( path = plikiDane [1], sheet = excel_sheets( plikiDane
[1]) [2] )
14 dane
15
16 ### Czyszczenie danych
17
18 ### Wyciaganie lat
19 daneLata <- unlist( dane [1,])
20 daneLata <- as.integer( daneLata [3: length(daneLata)])
21 daneLata
22
23 ### Wyciaganie nazw wojewodztw
24 daneNazwy <- unlist( dane [,2])
25 daneNazwy <- as.character( daneNazwy [4: length(daneNazwy)])
26 names( daneNazwy) <- NULL
27 daneNazwy
28
29 ### Wyciaganie wartosc
30 daneDim <- dim( dane)
31 daneWartosci <- apply( X = as.matrix( dane [4: daneDim [1], 3: daneDim [2]]),
32 MARGIN = c(1,2),
22
33 FUN = as.numeric)
34 daneWartosci <- as.data.frame( daneWartosci)
35 names( daneWartosci) <- daneLata
36 row.names( daneWartosci) <- daneNazwy
37 daneWartosci
38
39 ### Tworzenie wykresow
40 wykresPorownanie <- function( daneWartosci , nazwaWojewodztwa , skala = "
PLN"){
41
42 ## Wycinanie danch do wykresy
43 daneTemp <- daneWartosci[nazwaWojewodztwa ,]
44
45 ## Na podstawie liczby danych tworzenie roznych kolorow
46 cols <- rainbow( dim( daneTemp [1]))
47
48 ## Zmiana skali danych
49 switch( skala ,
50 "MLN␣PLN" = { daneTemp <- daneTemp/10^6}
51 )
52
53 ## Wyciaganie lat do wykresu
54 daneLata = as.integer( names( daneWartosci))
55
56 ## Tworzenie pierwszego wykresu
57 plot(x = daneLata , y = daneTemp [1,],
58 xlab = "lata",
59 ylab = skala ,
60 main = "Dochody",
61 type = "o",
62 pch = 20,
63 col = cols [1])
64
65 ## Jezeli wiecej wojewodztw to dorysowujemy kolejne wykresy
66 if( dim(daneTemp)[1] > 1 ){
67 for( k in 2:dim( daneTemp)[1] ){
68 lines( x = daneLata , y = daneTemp[k,], col = cols[k])
23
69 points( x = daneLata , y = daneTemp[k,], pch = 20, col = cols
[k])
70 }
71 }
72
73 ## Tworzenie i dodawanie legendy
74 legend( x = "topleft", nazwaWojewodztwa , col = cols , pch = 20)
75
76 ## Zwracam w sposob niewidoczny tabele z wykorzystanymi danymi
77 invisible( daneTemp)
78
79 }
80
81 nazwaWojewodztwa <- c( "POMORSKIE", "PODLASKIE", "OPOLSKIE")
82 wykresPorownanie( daneWartosci ,
83 c( "POMORSKIE", "PODLASKIE", "OPOLSKIE"),
84 skala = "PLN")
85 wykresPorownanie( daneWartosci ,
86 c( "POMORSKIE", "PODLASKIE", "OPOLSKIE"),
87 skala = "MLN␣PLN")
6.2 To samo co poprzednio ale z wykorzystaniem biblioteki
1 ### Wykorzystane biblioteki
2 source("./lib.R")
3
4 ### Ustawianie srodowiska pracy
5 Sys.setlocale("LC_CTYPE", "pl_PL")
6
7 ### Wczytanie danych
8 plikiDane <- dir()
9 daneWartosci <- czytajDane( nazwaPliku = plikiDane [1],
10 nazwaArkusza = excel_sheets( plikiDane [1]) [2]
)
11
12
13 ### Tworzenie wykresow
14
24
15 wykresPorownanie( daneWartosci ,
16 c( "POMORSKIE", "PODLASKIE", "OPOLSKIE"),
17 skala = "PLN")
18
19 wykresPorownanie( daneWartosci ,
20 c( "POMORSKIE", "PODLASKIE", "OPOLSKIE"),
21 skala = "MLN␣PLN")
6.3 Tworzenie prostych map
W następnym przykładzie wykorzystamy stworzoną powyżej bibliotekę oraz plik
z mapą województw pochodzący ze strony https://gis-support.pl/baza-wiedzy/
dane-do-pobrania/.
1 ### Wykorzystane biblioteki
2 source("./lib.R")
3
4 ### Wykorzystane biblioteki zewnetrzne
5 ### install.packages (" rgdal")
6 require(rgdal)
7 require(maptools)
8
9 ### Ustawianie srodowiska pracy
10 Sys.setlocale("LC_CTYPE", "pl_PL")
11
12 ### Wczytanie danych
13 plikiDane <- dir()
14 daneWartosci <- czytajDane( nazwaPliku = plikiDane [1],
15 nazwaArkusza = excel_sheets( plikiDane [1]) [2]
)
16
17 ### Wczytanie mapy
18 shape <- readOGR(dsn = "./mapy/wojewodztwa", layer = " w o j e w d z t w a ")
19
20 ### Interesujace pola w wczytanym obiekcie
21 shape@proj4string # rodzaj rzutu
25
22 shape@data # ramka danych zawierajaca potenclanie dane dotyczace
elementow przestrzenych
23
24 ### Niestety tutaj kodowanie polskich znakow nie jest poprawne , chcemy
25 ### jest poprawic taka a by mozna bylo je wykorzystac , niestety
26 ### rowniez kolejnosc nie jest identyczna z tym co jest w pliku XLSX
27 cbind( as.character( shape@data[,"jpt_nazwa_"]),
28 row.names( daneWartosci)
29 )
30
31 ### Poniewaz robimy to jeden raz wiec zrobimy reindeksowanie recznie ,
32 ### dla wiekszej liczby jednostek trzeba sie zastanowic jak zrobic to
33 ### automatycznie.
34
35 ind <- c( 8, 13, 2, 7, 11, 12, 14, 16, 1, 15, 5, 10, 6, 4, 9, 3)
36 cbind( as.character( shape@data[,"jpt_nazwa_"]),
37 row.names( daneWartosci)[ind]
38 )
39
40 ### Chcemy na mapie zaznaczyc te wojewodztwa , ktore maja dochody powyzej
mediany i te , ktore maja ponizej mediany
41
42 ### Tworzenie i selekcja danych
43 daneWartosciInd <- daneWartosci[ind ,] # zmiana kolejnosci wojewodztw na
zgodna z mapa
44 mediana <- quantile( daneWartosciInd[,"2016"], .5)
45 selektor <- daneWartosciInd[,"2016"] > mediana
46
47
48 ### Rysowanie mapy
49 plot( shape , col = "lightgray")
50 plot( shape[selektor ,], col = "red", add = TRUE)
26