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.
Dane zapisane w postaci pliku tekstowego importuje się za pomocą funkcji read.table(). Funkcja ta wymaga 3 argumentów:
moje_dane.txt). Jeśli dane znajdują się poza katalogiem roboczym, należy podać pełną ścieżkę do katalogu zawierającego dane.sep. Na przykład, jeśli kolumny są rozdzielane przecinkami, piszemy sep=","; jesli są rozdzielane średnikami, piszemy sep=";"; jeśli są rozdzielane tabulatorami, piszemy sep="\t".header na TRUE. W przeciwnym razie piszemy header=FALSE, zaś program nadaje kolejnym kolumnom nazwy domyślne.Rozpatrzmy na początek plik, który zawiera następujące zmienne:
respid – identyfikator respondentaoccupation – nazwa zawoduact.earn – ocena zarobków rzeczywistych w danym zawodziejust.earn – ocena zarobków sprawiedliwych w danym zawodzieinvest – indeks określający ,,nakłady'', jakie trzeba ponieść w związku z wykonywaniem danego zawodu.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
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.
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
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"