Porządkowanie danych o lokalizacji

Aby manipulować danymi w ten sposób, najpierw zbudujemy funkcję, która pobiera ciąg znaków jako dane wejściowe i wykonuje czyszczenie danych. Następnie uruchomimy tę funkcję na danych lokalizacji za pomocą jednej z wektoryzowanych funkcji wprowadzania:

get.location<-function(l) {

split.location<-tryCatch(strsplit(l,”,”)[[1]], error= function(e) return(c(NA, NA)))

clean.location<-gsub(“^ “,””,split.location)

if (length(clean.location)>2) {

return(c(NA,NA))

}

else {

return(clean.location)

}

}

W tej funkcji dzieje się kilka subtelnych rzeczy. Najpierw zauważ, że zawijamy polecenie strsplit w funkcji obsługi błędów R, tryCatch. Ponownie, nie wszystkie wpisy mają poprawną formę „Miasto, państwo”, a niektóre nawet nie zawierają przecinka. Funkcja strsplit zgłosi błąd, jeśli rozdzielony znak nie zostanie dopasowany; dlatego musimy złapać ten błąd. W naszym przypadku, gdy nie ma przecinka do rozdzielenia, zwrócimy wektor NA, aby wskazać, że ten wpis jest nieprawidłowy. Następnie oryginalne dane zawierały wiodące białe znaki, więc użyjemy funkcji gsub (część pakietu funkcji R do pracy z wyrażeniami regularnymi), aby usunąć wiodące białe znaki z każdego znaku. Na koniec dodajemy dodatkowe sprawdzenie, aby upewnić się, że zwracane są tylko te wektory lokalizacji o długości dwa. Wiele pozycji poza USA ma wiele przecinków, tworząc większe wektory z funkcji strsplit. W takim przypadku ponownie zwrócimy wektor NA. Po zdefiniowaniu funkcji będziemy używać funkcji lapply, skrót od „list-apply”, aby iterować tę funkcję po wszystkich ciągach w kolumnie Lokalizacja. Jak wspomniano, członkowie rodziny zastosowania funkcji w R są niezwykle przydatni. Są one zbudowane z zastosowania formy (wektor, funkcja) i zwracają wyniki wektorowego zastosowania funkcji do wektora w określonej formie. W naszym przypadku używamy lapply, które zawsze zwraca listę:

city.state<-lapply(ufo$Location, get.location)

head(city.state)

[[1]]

[1] “Iowa City” “IA”

[[2]]

[1] “Milwaukee” “WI”

[[3]]

[1] “Shelton” “WA”

[[4]]

[1] “Columbia” “MO”

[[5]]

[1] “Seattle” “WA”

[[6]]

[1] “Brunswick County” “ND”

Jak widać w tym przykładzie, lista w R jest strukturą danych w stylu klucz-wartość, w której klucze są indeksowane przez podwójny nawias, a wartości są zawarte w pojedynczym nawiasie. W naszym przypadku klucze są po prostu liczbami całkowitymi, ale listy mogą również zawierać łańcuchy jako klucze. Chociaż wygodnie jest przechowywać dane na liście, nie jest pożądane, ponieważ chcielibyśmy dodać informacje o mieście i stanie do ramki danych jako osobne kolumny. Aby to zrobić, musimy przekonwertować tę długą listę na macierz dwukolumnową, z danymi miasta jako kolumną wiodącą:

location.matrix<-do.call(rbind, city.state)

ufo<-transform(ufo, USCity=location.matrix[,1], USState=tolower(location.matrix[,2]),

stringsAsFactors=FALSE)

Aby skonstruować macierz z listy, używamy funkcji do.call. Podobnie do funkcji Apply, do.call wykonuje wywołanie funkcji na liście. Często używamy kombinacji lapply i do.call do manipulowania danymi. W poprzednim przykładzie przekazujemy funkcję rbind, która „wiąże wiersz” wszystkich wektorów z listy city.state w celu utworzenia macierzy. Aby wprowadzić to do ramki danych, używamy funkcji transformacji. Tworzymy dwie nowe kolumny: USCity i USState odpowiednio z pierwszej i drugiej kolumny location.matrix. Wreszcie skróty stanu są niespójne, z niektórymi dużymi i innymi małymi, więc używamy funkcji tolower, aby wszystkie były małe.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *