2012-10-20 8 views
9

Mam pewne dane szpitalne w ramce danych, odczytywane z pliku CSV. Próbowałem zamówić dataframe przez kolumnę col zdefiniowanej przez użytkownika, a następnie nazwa szpitala tak:Kolumna kolumny danych liczbowych niepoprawnie zamawiana jako ciąg

col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia' 
hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),] 

Ale myślę, że czegoś brakuje; wydaje sortować col jak struny:

> hospitals.sorted 
... # so far so good # ... 
2749             10.0 
2831             10.0 
2891             10.0 
2837             10.1 
2824             10.1 
2774             10.1 
... # not so good # ... 
2856             15.7 
2834             15.9 
2797             16.0 
2835             7.4 
2850             7.7 
2789             8.1 
... # there are some non-numeric values at the very bottom # ... 
2806             9.9 
2867             9.9 
2884             9.9 
2808           Not Available 
2913           Not Available 
2911           Not Available 

Wystarczy potwierdzić kolumna jest w rzeczywistości liczbowy:

> sapply(hospitals, mode) 
Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia 
"numeric" 
Hospital.Name 
"numeric" 

nie wiem dlaczego Hospital.Name jest numeryczny, gdy wyraźnie nie jest.

Inne rzeczy próbowałem bezskutecznie:

  • wykorzystujące as.numeric(hospitals[,col]) wnętrze order
  • usuwając "niedostępne" wartości przed sortowaniem

I może być czegoś brakuje podstawowych. Halp!

+2

Spróbuj 'str (szpitale)'? Prawdopodobnie masz problem z czynnikami. –

Odpowiedz

16

W ramkach danych poszczególne komponenty muszą być wektorami atomowymi. Uwzględniasz dane liczbowe i dane znakowe we wspomnianej zmiennej i jako takie R będą je czytać jako wektor znaków. Jednak z powodu domyślnego ustawienia argumentu stringsAsFactors wektor znaków zostanie przekonwertowany na współczynnik. I tak będzie wyglądało, że liczby są zapisywane jako cyfry. Są to jednak tylko etykiety i jesteś oszukiwany.

Podobnie jest również z połączeniem mode(). Zastanów się, czy nie jest to dane "numeryczne", to:

> mode(factor(c(1:10, "a"))) 
[1] "numeric" 

Następny rozważyć

> mode(factor(letters)) 
[1] "numeric" 

To przeczy fakt, że czynniki wewnętrznie R są przechowywane jako zmienne numeryczne i to mode() mówi ci. mode() jest niewłaściwym narzędziem do tego zadania.

celu sprawdzenia, czy zmienna jest liczbą użyć is.numeric() zamiast:

> is.numeric(factor(c(1:10, "a"))) 
[1] FALSE 
> is.numeric(factor(letters)) 
[1] FALSE 

odniesieniu do roztworu. "Niedostępny" musi być ustawiony na NA. Możesz to zrobić, odczytując dane, dodając na.strings = "Not Available" do wywołania (lub innego podobnego opakowania). To powinno wystarczyć do uporządkowania konwersji postaci i współczynnika.

Najważniejszą wskazówką jest zawsze sprawdzanie, czy dane wyjściowe obiektu str() zostały zastosowane do obiektu, aby sprawdzić, czy R odczytał dane zgodnie z oczekiwaniami. Powinieneś:

str(hospitals) 

i zanotuj typy zmiennych zgodnie z R.

Jeżeli chodzi o inne rzeczy, które próbowałem:

  1. as.numeric(hospitals[,col]) będzie produkować wektor numeryczny zawierający identyfikator poziomu dla każdego elementu czynnika. Jeśli czynnik sortuje w określonej kolejności, to będzie to reprezentacja poziomów. Aby przekonwertować czynnik (jest to wersja oznaczona etykietą) na numeryczny, należy wykonać krok pośredni: as.numeric(as.character(hospitals[, col])). Nie rozwiąże to jednak problemu, który tu masz, ponieważ masz dane znakowe w zmiennej, a R nie będzie w stanie przekonwertować go na wartość numeryczną. Przekona on "Not Available" na NA, który mógł zadziałać, gdyby użytkownik próbował as.numeric(as.character(hospitals[, col])).
  2. Po usunięciu "Not Available", przypuszczam, że upuszczając te wiersze/elementy ?, nadal pozostawi pozostałe obserwacje w czynniku. Co z powodów wymienionych powyżej nie zadziała, ponieważ będzie sortować alf na etykietach/poziomach.
+0

Dziękuję za szybką i informacyjną odpowiedź! – greenbeansugar

Powiązane problemy