Aby rozwiązać ten problem, najpierw musimy zlokalizować wiersze z uszkodzonymi ciągami dat, a następnie zdecydować, co z nimi zrobić. Mamy szczęście w tym przypadku, ponieważ wiemy z błędu, że błędne wpisy są „zbyt długie”. Prawidłowo przeanalizowane ciągi zawsze będą miały osiem znaków, tj. „RRRRMMDD”. Aby znaleźć wiersze z problemami, musimy po prostu znaleźć te, które mają ciągi zawierające więcej niż osiem znaków. Jako najlepszą praktykę najpierw sprawdzamy dane, aby zobaczyć, jak wyglądają zniekształcone dane, aby lepiej zrozumieć, co poszło nie tak. W takim przypadku użyjemy head, działa jak poprzednio, aby sprawdzić dane zwrócone przez naszą logiczną instrukcję. Później, aby usunąć te błędne wiersze, użyjemy funkcji ifelse do skonstruowania wektora wartości PRAWDA i FAŁSZ, aby zidentyfikować wpisy o długości ośmiu znaków (PRAWDA) i te, które nie są (FAŁSZ). Ta funkcja jest wektoryzowaną wersją typowego if-else, przełącznika logicznego dla niektórych testów logicznych. Zobaczymy wiele przykładów operacji wektoryzowanych w R. Są one preferowanym mechanizmem iteracji danych, ponieważ często są – ale nie zawsze – bardziej wydajne niż jawne iteracje po wektorze:
head(ufo[which(nchar(ufo$DateOccurred)!=8 | nchar(ufo$DateReported)!=8),1])
[1] “ler@gnv.ifas.ufl.edu”
[2] “0000”
[3] “Callers report sighting a number of soft white balls of lights headingin
an easterly directing then changing direction to the west beforespeeding off to
the north west.”
[4] “0000”
[5] “0000”
[6] “0000”
good.rows<-ifelse(nchar(ufo$DateOccurred)>!=8 | nchar(ufo$DateReported)!=8,FALSE,
TRUE)
length(which(!good.rows))
[1] 371
ufo<-ufo[good.rows,]
Do wykonania tego wyszukiwania używamy kilku przydatnych funkcji R. Musimy znać długość łańcucha w każdym wpisie DateOccurred i DateReported, więc do obliczenia tego używamy funkcji nchar. Jeśli ta długość nie jest równa osiem, zwracamy FAŁSZ. Kiedy już mamy wektory booleanów, chcemy zobaczyć, ile wpisów w ramce danych zostało zniekształconych. Aby to zrobić, używamy polecenia what, aby zwrócić wektor indeksów wektorowych, które są FAŁSZ. Następnie obliczamy długość tego wektora, aby znaleźć liczbę złych wpisów. Ponieważ tylko 371 wierszy jest niezgodnych, najlepszą opcją jest po prostu usunięcie tych wpisów i zignorowanie ich. Na początku możemy się martwić, że utrata 371 wierszy danych jest złym pomysłem, ale jest ich ponad 60 000, więc po prostu zignorujemy te zniekształcone wiersze i będziemy kontynuować konwersję na typy dat:
ufo$DateOccurred<-as.Date(ufo$DateOccurred, format=”%Y%m%d”)
ufo$DateReported<-as.Date(ufo$DateReported, format=”%Y%m%d”)
Następnie będziemy musieli wyczyścić i uporządkować dane lokalizacji. Przypomnijmy z poprzedniego wezwania, że wpisy dotyczące obserwacji UFO w Stanach Zjednoczonych przyjmują postać „City, State”. Możemy użyć integracji wyrażeń regularnych R, aby podzielić te ciągi na osobne kolumny i zidentyfikować te wpisy, które nie są zgodne. Ta ostatnia część, identyfikująca te, które nie są zgodne, jest szczególnie ważna, ponieważ jesteśmy zainteresowani jedynie obserwacją zmian w Stanach Zjednoczonych i wykorzystamy te informacje do wyodrębnienia tych wpisów.