Importowanie danych

Ustanawianie katalogu roboczego

Katalog roboczy jest ,,domyślnym'' katalogiem, w którym R szuka plików różnego rodzaju (danych, skryptów, itp.) i w którym zapisuje pliki, dane, wykresy utworzone w trakcie danej sesji. Aby sprawdzić, który katalog jest aktualnie katalogiem roboczym, korzystamy z funkcji getwd().

getwd()
## [1] "/home/zbyszek/Dropbox/Statystyka dla doktorantów"

Aby okreslić lub zmienić katalog roboczy, korzystamy z funkcji setwd():

setwd("/ścieżka/do/wybranego/katalogu")

Ścieżkę do wybranego katalogu zawsze podajemy w cudzysłowie. Kolejne podkatalogi oddzielamy symbolem ,,/''. Określenie katalogu roboczego jest wygodnym rozwiązaniem, jeśli w trakcie pracy wielokrotnie pobieramy dane i inne pliki lub wielokrotnie zapisujemy dane, pliki i wykresy: przy każdym wczytaniu lub zapisie kolejnego pliku wystarczy podać tylko jego nazwę, nie trzeba podawać pełnej ścieżki.

Importowanie danych z pliku tekstowego

Dane zapisane w postaci pliku tekstowego importuje się za pomocą funkcji read.table(). Funkcja ta wymaga 3 argumentów:

Przykład nr 1

Rozpatrzmy na początek plik, który zawiera następujące zmienne:

Struktura tego zbioru wygląda następująco:

##            respid.occupation.act.earn.just.earn.invest
## 1                   1,CEO,11000,10000,4.10710159865536
## 2 1,GP in a public hospital,2500,3500,3.12565803672948
## 3                1,attorney,7500,5000,5.16050816616303
## 4             1,bricklayer,1000,2000,-5.35933329307023
## 5       1,city bus driver,1500,2000,-0.575789260038433
## 6       1,small-shop owner,2000,2500,-3.98687985535303

Pierwszy wiersz zawiera nazwy zmiennych, wartości w kolejnych wierszach oddzielone są przecinkami. Wczytanie tego zbioru do R wymaga więc posłużenia się następującym poleceniem:

p <- read.table("dane1.csv", head = TRUE, sep = ",")
head(p)  # wyświetla kilka pierwszych wierszy ze zbioru danych
##   respid              occupation act.earn just.earn  invest
## 1      1                     CEO    11000     10000  4.1071
## 2      1 GP in a public hospital     2500      3500  3.1257
## 3      1                attorney     7500      5000  5.1605
## 4      1              bricklayer     1000      2000 -5.3593
## 5      1         city bus driver     1500      2000 -0.5758
## 6      1        small-shop owner     2000      2500 -3.9869

Przykład nr 2

Separatorem miejsc dziesiętnych domyślnie przyjmowanym przez funkcję read.table() jest kropka. Aby zmienić to domyślne ustawienie, należy posłużyć się opcjonalnym argumentem dec.

Dla przykładu, przypuśćmy, że kolejne kolumny są rozdzielane średnikiem, zaś separatorem miejsc dziesiętnych jest przecinek.

##            respid.occupation.act.earn.just.earn.invest
## 1                   1;CEO;11000;10000;4,10710159865536
## 2 1;GP in a public hospital;2500;3500;3,12565803672948
## 3                1;attorney;7500;5000;5,16050816616303
## 4             1;bricklayer;1000;2000;-5,35933329307023
## 5       1;city bus driver;1500;2000;-0,575789260038433
## 6       1;small-shop owner;2000;2500;-3,98687985535303

Jeśli w poleceniu importującym dane do R nie zadeklarujemy przecinka jako separatora miejsc dziesiętnych, uzyskamy następujący efekt:

p <- read.table("dane3.csv", head = TRUE, sep = ";")
head(p)
##   respid              occupation act.earn just.earn             invest
## 1      1                     CEO    11000     10000   4,10710159865536
## 2      1 GP in a public hospital     2500      3500   3,12565803672948
## 3      1                attorney     7500      5000   5,16050816616303
## 4      1              bricklayer     1000      2000  -5,35933329307023
## 5      1         city bus driver     1500      2000 -0,575789260038433
## 6      1        small-shop owner     2000      2500  -3,98687985535303

Jak widzimy, kolejne zmienne zostały rozdzielone poprawnie, ale zmienna invest nie jest przez program traktowana jako zmienna liczbowa, lecz znakowa. Dla przykładu, próba wyznaczenia wartości średniej tej zmiennej daje:

mean(p[, "invest"])
## Warning: argument is not numeric or logical: returning NA
## [1] NA

Program zwraca ostrzeżenie, iż zmienna nie ma characteru liczbowego ani logicznego, wyznaczenie wartości średniej nie jest więc możliwe. Prawidłowe wczytanie tego zbioru danych wymaga posłużenia się następującym poleceniem:

p <- read.table("dane3.csv", head = TRUE, sep = ";", dec = ",")
head(p)
##   respid              occupation act.earn just.earn  invest
## 1      1                     CEO    11000     10000  4.1071
## 2      1 GP in a public hospital     2500      3500  3.1257
## 3      1                attorney     7500      5000  5.1605
## 4      1              bricklayer     1000      2000 -5.3593
## 5      1         city bus driver     1500      2000 -0.5758
## 6      1        small-shop owner     2000      2500 -3.9869
mean(p[, "invest"])
## [1] -9.268e-16

Jak widzimy, tym razem średnią wartość zmiennej invest udało się wyznaczyć bez problemu.

Przykład nr 3

Przypuśćmy teraz, że separatorem kolumn jest tabulator, nastomiast znacznikiem miejsc ddziesiętnych — przecinek:

##                respid.occupation.act.earn.just.earn.invest
## 1                   1\tCEO\t11000\t10000\t4,10710159865536
## 2 1\tGP in a public hospital\t2500\t3500\t3,12565803672948
## 3                1\tattorney\t7500\t5000\t5,16050816616303
## 4             1\tbricklayer\t1000\t2000\t-5,35933329307023
## 5       1\tcity bus driver\t1500\t2000\t-0,575789260038433
## 6       1\tsmall-shop owner\t2000\t2500\t-3,98687985535303

Wczytanie tego zbioru wymaga teraz posłużenia się następującym poleceniem:

p <- read.table("dane4.csv", head = TRUE, sep = "\t", dec = ",")
head(p)
##   respid              occupation act.earn just.earn  invest
## 1      1                     CEO    11000     10000  4.1071
## 2      1 GP in a public hospital     2500      3500  3.1257
## 3      1                attorney     7500      5000  5.1605
## 4      1              bricklayer     1000      2000 -5.3593
## 5      1         city bus driver     1500      2000 -0.5758
## 6      1        small-shop owner     2000      2500 -3.9869

Importowanie danych w formacie SPSS

Programem najczęściej wykorzystywanym w naukach społecznych do analizy danych z badań ilościowych jest SPSS, stąd też wiele zbiorów danych z badań społecznych, które dostępne są w domenie publicznej, publikuje się w formacie obsługiwanym przez ten program (roszerzenie .sav, .SAV lub .por ). Pliki w tym formacie można bez problemu importować do R wykorzystując funkcję read.spss pakietu foreign. Pakiet foreign zawiera szereg innych funkcji, za pomocą których możemy wczytywać dane w formatach obsługiwanych przez inne popularne aplikacje do analizy danych, takie jak Stata czy SAS.

Uruchomienie pakietu foreign wymaga następującego polecenia:

library(foreign)  # lub
require(foreign)

Przypuśćmy, że wykorzystywane we wcześniejszych przykładach są zapisane w pliku w formacie SPSS. Przypuśćmy też, że plik ten jest zapisany w naszym katalogu roboczym. Import danych w formacie SPSS do R wymaga posłużenia się następującym poleceniem:

dane_spss <- read.spss("dane.sav", use.value.labels = FALSE, to.data.frame = TRUE)
## re-encoding from UTF-8
head(dane_spss)
##   respid act.earn just.earn  invest occ
## 1      1    11000     10000  4.1071   4
## 2      1     2500      3500  3.1257   7
## 3      1     7500      5000  5.1605   1
## 4      1     1000      2000 -5.3593   3
## 5      1     1500      2000 -0.5758   5
## 6      1     2000      2500 -3.9869   8

Zauważmy, że zmienna occ zamiast nazw zawodów zawiera teraz wartości liczbowe. Wynika to stąd, że argument use.value.labels ma w powyższym przykładzie wartość FALSE. Mówiąc inaczej, w przykładzie powyżej poprosiliśmy program, aby pominął etykiety wartości i wczytał same wartości liczbowe. Jest to skądinąd wygodniejsze, jeśli planujemy przekształcać (rekodować) oryginalne wartości zmiennych po wczytaniu zbioru danych do R. Jeśli chcemy dowiedzieć się, jakie są etykiety wartości zmiennej occ, wpisujemy:

attributes(dane_spss[, "occ"])
## $value.labels
## small-shop owner   medical doctor      farm worker  city bus driver 
##              "8"              "7"              "6"              "5" 
##              CEO       bricklayer       bank clerk         attorney 
##              "4"              "3"              "2"              "1"

Z wydruku powyżej dowiadujemy się, że wartość 1 zmiennej occ oznacza adwokata, wartość 2 — urzędnika w banku, itp.

Jeśli chcemy dowiedzieć się, jakie zmienne znajdują się w zbiorze danych i jakie są ich etykiety, wpisujemy:

attr(dane_spss, "variable.labels")
##                                       respid 
##                               "Subject's ID" 
##                                     act.earn 
##   "Subjective evaluation of actual earnings" 
##                                    just.earn 
##     "Subjective evaluation of just earnings" 
##                                       invest 
## "Index of cost of working in the occupation" 
##                                          occ 
##                                 "Occupation"