KSAP / Podstawy programowania w R -...

26
KSAP / Podstawy programowania w R Michal Ramsza 1

Transcript of KSAP / Podstawy programowania w R -...

KSAP / Podstawy programowania w R

Michał Ramsza

1

Spis treści

2

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