Dariusz Brzeziński
Slajdy przygotowane w oparciu o materiały Jeffreya Leeka.
Każda analiza danych powinna posiadać co najmniej cztery pliki:
Ten dokument przyjmuje z reguły formę prostego pliku tekstowego i zawiera:
Skrypt transformujący dane jest kluczowy dla powtarzalności analizy!
R posiada funkcje pozwalające czytać i zapisywać dane w takich formatach jak:
Podstawowe funkcje:
read.table
, read.csv
, dla danych tabelarycznych readLines
, do czytania plików tekstowychsource
, do wczytywania źródeł R (odwrotność dump
) dget
, do wczytywania źródeł R (odwrotność dput
)load
, do wczytywania obszarów roboczychunserialize
, do deserializacji obiektów RAnalogiczne funkcje zapisu:
read.table
to najczęściej wykorzystywana funkcja do wczytywania danych.
Jej podstawowe argumenty to:
file
, plik z danymi lub połączenie do źródła danychheader
, określa czy dane zawierają wiersz nagłówkowysep
, sposób rozdzielania kolumncolNames
, nazwy kolumncolClasses
, typy kolumn na.strings
, sposób kodowania brakujących wartościnrows
, liczba wierszy w zbiorzecomment.char
, znak komentarzadec
, separator liczb dziesiętnychskip
, ile wierszy pominąćstringsAsFactors
, określa czy łańcuchy znaków traktować jako typy wyliczenioweDla małych i średnich zbiorów danych można wywołać read.table bez żadnych argumentów:
data <- read.table("foo.txt")
R automatycznie:
read.csv
, read.csv2
, read.delim
, read.delim2
robią to samo ale mają inne wartości domyślne.
Dla bardzo dużych zbiorów danych, warto wykonać kilka rzeczy, żeby wczytywanie było w miarę szybkie:
comment.char = ""
, jeśli plik nie zawiera komentarzycolClasses
, aby jawnie wyspecyfikować typy kolumn - to BARDZO przyspieszy
wczytywanie. Albo znasz wszystkie typy kolumn albo możesz wypróbować następującą
heurystykę:initial <- read.table("data.txt", nrows = 100)
classes <- sapply(initial, class)
tabAll <- read.table("data.txt",
colClasses = classes)
nrows
- nie poprawi to szybkości wczytywania, ale poprawi zarządzanie pamięcią.
Lekkie przeszacowanie też może być.Podstawowa funkcja to download.file()
Spróbuj wczytać dane z następującego pliku:
GUS: Portret Poznania 2002-2014
W ramach poprzednich lekcji omówiliśmy już podstawowe metody filtrowania wierszy i kolumn tabel oraz dowiedzieliśmy się jak dodawać nowe wiersze i kolumny.
Istnieje jednak biblioteka, która skraca, przyspiesza i uspójnia te i inne operacje wstępnego przetwarzania danych…
plyr
select
: wybiera podzbiór kolumnfilter
: filtruje wiersze na podstawie wskazanych warunkówarrange
: sortuje wiersze w zbiorze danychrename
: zmienia nazwy zmiennychmutate
: tworzy nowe kolumny lub redefiniuje istniejącesummarise
/ summarize
: tworzy podsumowania wskazanych statystyk, potencjalnie
wewnątrz określonych grup danychKonieczny krok!
library(dplyr)
chicago <- readRDS("chicago.rds")
dim(chicago)
[1] 6940 8
head(select(chicago, 1:5))
city tmpd dptp date pm25tmean2
1 chic 31.5 31.500 1987-01-01 NA
2 chic 33.0 29.875 1987-01-02 NA
3 chic 33.0 27.375 1987-01-03 NA
4 chic 29.0 28.625 1987-01-04 NA
5 chic 32.0 28.875 1987-01-05 NA
6 chic 40.0 35.125 1987-01-06 NA
names(chicago)[1:3]
[1] "city" "tmpd" "dptp"
head(select(chicago, city:dptp))
city tmpd dptp
1 chic 31.5 31.500
2 chic 33.0 29.875
3 chic 33.0 27.375
4 chic 29.0 28.625
5 chic 32.0 28.875
6 chic 40.0 35.125
Z dplyr można wykonać następującą operację:
head(select(chicago, -(city:dptp)))
Tradycyjnie w R trzeba by to zrobić tak:
i <- match("city", names(chicago))
j <- match("dptp", names(chicago))
head(chicago[, -(i:j)])
chic.f <- filter(chicago, pm25tmean2 > 30)
head(select(chic.f, 1:5, pm25tmean2), 10)
city tmpd dptp date pm25tmean2
1 chic 23 21.9 1998-01-17 38.10
2 chic 28 25.8 1998-01-23 33.95
3 chic 55 51.3 1998-04-30 39.40
4 chic 59 53.7 1998-05-01 35.40
5 chic 57 52.0 1998-05-02 33.30
6 chic 57 56.0 1998-05-07 32.10
7 chic 75 65.8 1998-05-15 56.50
8 chic 61 59.0 1998-06-09 33.80
9 chic 73 60.3 1998-07-13 30.30
10 chic 78 67.1 1998-07-14 41.40
chic.f <- filter(chicago, pm25tmean2 > 30 & tmpd > 80)
head(select(chic.f, 1:3, pm25tmean2, tmpd), 10)
city tmpd dptp pm25tmean2
1 chic 81 71.2 39.6000
2 chic 81 70.4 31.5000
3 chic 82 72.2 32.3000
4 chic 84 72.9 43.7000
5 chic 85 72.6 38.8375
6 chic 84 72.6 38.2000
7 chic 82 67.4 33.0000
8 chic 82 63.5 42.5000
9 chic 81 70.4 33.1000
10 chic 82 66.2 38.8500
Sortowanie wierszy jest dużo łatwiejsze z dplyrem.
chicago <- arrange(chicago, date)
# można też dodać desc:
# arrange(chicago, desc(date))
head(select(chicago, date, pm25tmean2), 3)
date pm25tmean2
1 1987-01-01 NA
2 1987-01-02 NA
3 1987-01-03 NA
head(chicago[, 1:5], 3)
city tmpd dptp date pm25tmean2
1 chic 31.5 31.500 1987-01-01 NA
2 chic 33.0 29.875 1987-01-02 NA
3 chic 33.0 27.375 1987-01-03 NA
chicago <- rename(chicago, dewpoint = dptp,
pm25 = pm25tmean2)
head(chicago[, 1:5], 3)
city tmpd dewpoint date pm25
1 chic 31.5 31.500 1987-01-01 NA
2 chic 33.0 29.875 1987-01-02 NA
3 chic 33.0 27.375 1987-01-03 NA
chicago <- mutate(chicago, pm25detrend=pm25-mean(pm25, na.rm=TRUE))
head(select(chicago, pm25, pm25detrend))
pm25 pm25detrend
1 NA NA
2 NA NA
3 NA NA
4 NA NA
5 NA NA
6 NA NA
chicago <- mutate(chicago,
tempcat=factor(1*(tmpd > 80),
labels = c("cold", "hot")))
hotcold <- group_by(chicago, tempcat)
summarize(hotcold, pm25=mean(pm25, na.rm=TRUE),
o3 = max(o3tmean2),
no2 = median(no2tmean2))
# A tibble: 3 x 4
tempcat pm25 o3 no2
<fct> <dbl> <dbl> <dbl>
1 cold 16.0 66.6 24.5
2 hot 26.5 63.0 24.9
3 <NA> 47.7 9.42 37.4
chicago %>% mutate(month=as.POSIXlt(date)$mon+1)
%>% group_by(month)
%>% summarize(pm25=mean(pm25, na.rm=TRUE),
o3=max(o3tmean2, na.rm=TRUE),
no2=median(no2tmean2, na.rm=TRUE))
# A tibble: 12 x 4
month pm25 o3 no2
<dbl> <dbl> <dbl> <dbl>
1 1 17.8 28.2 25.4
2 2 20.4 37.4 26.8
3 3 17.4 39.0 26.8
4 4 13.9 47.9 25.0
5 5 14.1 52.8 24.2
6 6 15.9 66.6 25.0
7 7 16.6 59.5 22.4
8 8 16.9 54.0 23.0
9 9 15.9 57.5 24.5
10 10 14.2 47.1 24.2
11 11 15.2 29.5 23.6
12 12 17.5 27.7 24.5
Dodajemy nowy kurs do instalacji swirl.pl:
library(swirl.pl)
install_from_swirl("Przetwarzanie_danych")
Wykonujemy lekcje z kursu Przetwarzanie danych:
swirl()