Konfiguracja danych dla tego przykładu jest prosta. Załadujemy dane, poprawnie oznaczymy brakujące wartości i utworzymy nowe zmienne do naszej analizy. Zanim zaczniemy, upewnij się, że plik data.csv znajduje się w tym samym katalogu, co kod, z którym pracujesz, i że twój katalog roboczy jest poprawnie skonfigurowany. Jeśli nie wiesz jak to zrobić, skonfigurowanie katalogu roboczego jest dość łatwe, po prostu wywołaj funkcję setwd() przekazującą katalog chcesz użyć jako takiego. Na przykład setwd(/home/user/examples użyje katalogu /home/users/examples do wyszukiwania plików i zapisywania plików.
Możemy załadować zawartość pliku data.csv do ramki danych (najbardziej intuicyjna struktura do wykorzystania z danymi w formacie CSV) za pomocą funkcji read.csv. Zwróć uwagę, że dane mają pewne braki w zmiennej Leave. Te wartości mają wartość -1, aby je zidentyfikować. Jednak właściwym sposobem identyfikacji brakujących wartości w R jest NA, którego używamy do zastępowania wartości -1.
data <- read.csv(„./data+brexit_referendum.csv”)
data[daa$Leave == -1, „Leave”] <- NA
Aby policzyć liczbę brakujących wartości w naszych danych, możemy użyć funkcji is.na(), aby uzyskać wektor logiczny (boolowski) zawierający TRUE wartości w celu zidentyfikowania brakujących wartości i FALSE wartości do zidentyfikować wartości bez braków danych. Długość takiego wektora będzie równa długości wektora używanego jako wejście, którym w naszym przypadku jest zmienna Leave. Następnie możemy użyć tego wektora logicznego jako danych wejściowych dla sum(), jednocześnie wykorzystując sposób, w jaki R traktuje takie wartości TRUE/FALSE aby uzyskać liczbę brakujących wartości. TRUE jest traktowane jako 1, podczas gdy FALSE jest traktowane jako 0. Okazuje się, że liczba brakujących wartości w zmiennej Leave wynosi 267.
sum(is.na(data$Leave)
#> [1] 267
Jeśli chcemy, możemy użyć mechanizmu do uzupełnienia brakujących wartości. Powszechnym i prostym mechanizmem jest przypisanie średniej zmiennej. Na razie zachowamy prostotę i zostawimy je jako brakujące wartości. Przechodzimy teraz do zdefiniowania nowej zmiennej Proportion, która będzie zawierała procent głosów za opuszczeniem UE. W tym celu dla każdego podopiecznego dzielimy zmienną Leave (liczba głosów za odejściem) przez zmienną NVotes (łączna liczba głosów). Biorąc pod uwagę zwektoryzowany charakter R, jest to proste:
data$Proportion <- data$Leave / data$NVotes
Tworzymy nową zmienną w ramce danych, po prostu ją przypisując. Nie ma różnicy między utworzeniem nowej zmiennej a modyfikacją istniejącej, co oznacza, że musimy zachować ostrożność, aby upewnić się, że przypadkowo nie nadpisujemy starej zmiennej. Teraz utwórz nową zmienną, która zawiera klasyfikację tego, czy większość wychowanków głosowała za opuszczeniem UE, czy też pozostaniem w UE. Jeśli więcej niż 50 procent głosów każdego z podopiecznych było za opuszczeniem, wówczas oznaczymy go jako głosującego za opuszczeniem i odwrotnie. Ponownie, R czyni to bardzo prostym za pomocą funkcji ifelse(). Jeśli wspomniany warunek (pierwszy parametr) jest spełniony, to przypisaną wartością będzie „Leave” (drugi parametr); w przeciwnym razie „Remain” (trzeci parametr). Jest to operacja zwektoryzowana, więc zostanie wykonana dla każdej obserwacji w ramce danych:
data$Vote <- ifelse(data$Proportion > 0.5, „Leave”, „Remain”)
Czasami ludzie lubią używać innej składni dla tego typu operacji; będą używać metody przypisywania podzbiorów, która różni się nieco od tego, którego używaliśmy. Nie będziemy wchodzić w szczegóły różnic między tymi podejściami, ale pamiętaj, że to drugie podejście może spowodować błąd w naszym przypadku:
data[data$Proportion > 0.5 , „Vote”] <- „Leave”
data[data$Proportion <= 0.5 , „Vote”] <- „Remain”
#> Error in `[<-.data.frame`(`*tmp*`, data$Proportion 0.5, “Vote”, value =
“Leave”):
#> missing values are not allowed in subscripted assignments of data frames
Dzieje się tak, ponieważ zmienna Proportion zawiera pewne braki wartości, które były konsekwencją tego, że zmienna Leave ma jakieś NA wartości na pierwszym miejscu. Ponieważ nie możemy obliczyć wartości Proportiondla obserwacji z NA wartościami w Leave, kiedy ją tworzymy, odpowiadające im wartości również otrzymują przypisaną wartość NA.
Jeśli upieramy się przy użyciu metody przypisywania podzbiorów, możemy sprawić, że zadziała, używając funkcji which(). Zignoruje (zwracając jako FALSE) te wartości, które zawierają NA w porównaniu. W ten sposób nie da nam to błędu i uzyskamy taki sam wynik, jak użycie funkcji ifelse(). Powinniśmy używać funkcji ifelse(), gdy jest to możliwe, ponieważ jest prostsza, łatwiejsza do odczytania i wydajniejsza
.
data[which(data$Proportion > 0.5) , „Vote”] <- „Leave”
data[which(data$Proportion <= 0.5) , „Vote”] <- „Remain”
W przyszłości będziemy chcieli stworzyć wykresy zawierające informacje RegionName, a posiadanie długich nazw najprawdopodobniej utrudni ich odczytanie. Aby to naprawić, możemy skrócić te nazwy, gdy jesteśmy w trakcie czyszczenia danych.
data$RegionName <- as.character(data$RegionName)
data[data$RegionName == „London” , „RegionName”] <- „L”
data[data$RegionName == „North West” , „RegionName”] <- „NW”
data[data$RegionName == „North East” , „RegionName”] <- „NE”
data[data$RegionName == „South West” , „RegionName”] <-„SW”
data[data$RegionName == „South East” , „RegionName”] <- „SE”
data[data$RegionName == „East Midlands” , „RegionName”] <-„EM”
data[data$RegionName == „West Midlands” , „RegionName”] <- „WM”
data[data$RegionName == „East England” , „RegionName”] <- „EE”
data[data$RegionName == „Yorkshire and The Humber” , „RegionName”] <-„Y”
Zauważ, że pierwsza linia w poprzednim bloku kodu przypisuje transformację znaku RegionName w typ znaku. Zanim to zrobimy, typem zmiennej jest współczynnik (który pochodzi z domyślnego sposobu odczytu danych za pomocą read.cvs) i uniemożliwia nam to przypisanie innej wartości niż te już zawarte w zmiennej. W takim przypadku otrzymamy błąd, Invalid factor level, NA generated. Aby uniknąć tego problemu, trzeba wykonać transformację typu. Mamy teraz czyste dane gotowe do analizy. Stworzyliśmy nową interesującą zmienną dla nas (Proportion), na czym skupimy się w pozostałej części ,ponieważ w tym przykładzie jesteśmy zainteresowani ustaleniem relacji między innymi zmiennymi i tym, jak ludzie głosował w referendum.