2013-06-20 16 views
13

Bardzo proste pytanie tutaj jak ja dopiero zaczynają korzystać z R, ale staram się tworzyć bar wykres liczby czynnikiem ggplot2 i podczas drukowania, dostać 14 małych kolorowych blips reprezentujący moje rzeczywiste poziomy a następnie masywny szary pasek na końcu reprezentujący 5000-nanowy NA w próbce (to dane z ankiety z pytania, które dotyczy tylko około 5% próbki). Próbowałem poniższy kod bezskutecznie:Eliminowanie Agencje krajowe ze ggplot

ggplot(data = MyData,aes(x= the_variable, fill=the_variable, na.rm = TRUE)) + 
    geom_bar(stat="bin") 

Dodanie argumentu na.rm tutaj nie ma widocznego efektu.

tymczasem

ggplot(data = na.omit(MyData),aes(x= the_variable, fill=the_variable, na.rm = TRUE)) + 
    geom_bar(stat="bin") 

daje mi

"Error: Aesthetics must either be length one, or the same length as the data"

jak nie umieszczanie na.omit() do the_variable lub oba MyData i the_variable.

Wszystko co chcę zrobić, to wyeliminować olbrzymi NA bar z mojego wykresu, może ktoś mi pomóc to zrobić?

+2

Naprawdę nie da się pomóc bez posiadania danych. Musisz podać [mały przykład] (http://stackoverflow.com/q/5963269/324364), który możemy faktycznie uruchomić, abyśmy mogli spojrzeć na twoją faktyczną strukturę danych. – joran

+2

Bez dostrzegania twoich danych, możesz być w stanie dokonać podzestawu na wartości inne niż NA dla celów plotowania. Tj. 'MyData.sub <- MyData [! Is.na (MyData)]', a następnie po prostu wykreśl podzbiór. Często robię coś podobnego do usuwania zer. – dayne

+0

Czy to wystarczy, aby tylko uzupełnić zmienną wypełnienia? 'fill = factor (the_variable)' –

Odpowiedz

16

Można użyć podzbiór funkcji wewnątrz ggplot2. Spróbuj tego

library(ggplot2) 

data("iris") 
iris$Sepal.Length[5:10] <- NA # create some NAs for this example 

ggplot(data=subset(iris, !is.na(Sepal.Length)), aes(x=Sepal.Length)) + 
geom_bar(stat="bin") 
+0

Niestety, 'iris' nie ma żadnych NA.) – ikashnitsky

+0

teraz to robi. Dzięki za główki :) –

+0

Ha! To dobry sposób na potraktowanie komentarza)) Wydaje mi się, że prawie w każdym przypadku istnieje dobrze dopasowany zbiór danych [z wbudowanych R] (https://vincentarelbundock.github.io/Rdatasets/datasets.html) – ikashnitsky

0

Z mojego punktu widzenia ten błąd „Błąd: Estetyka musi być albo długość jednego, lub taką samą długość jak dane” dotyczy AES argument (x, y) Próbowałem na.omit() i działał dla mnie dobrze.

1

tylko aktualizacja do odpowiedzią @ rafa.pereira. Od ggplot2 jest częścią tidyverse, ma sens używać wygodnych funkcji tidyverse, aby pozbyć się NA.

library(tidyverse) 
airquality %>% 
     drop_na(Ozone) %>% 
     ggplot(aes(x = Ozone))+ 
     geom_bar(stat="bin") 

Należy pamiętać, że można również użyć drop_na() bez specyfikacji kolumn; następnie wszystkie wiersze z NA w dowolnej kolumnie zostaną usunięte.

2

Nie wiem, czy masz rozwiązany problem. W tym przypadku możesz użyć funkcji "filter" w pakiecie dplyr. Chodzi o filtrowanie obserwacji/wierszy, których wartością zmiennej interesującej nie jest NA. Następnie tworzysz wykres z tymi filtrowanymi obserwacjami. Możesz znaleźć moje kody poniżej i pamiętać, że cała nazwa ramki danych i zmiennej jest kopiowana z pytania twojego pytania. Zakładam też, że znasz operatorów rur.

library(tidyverse) 

MyDate %>% 
    filter(!is.na(the_variable)) %>% 
    ggplot(aes(x= the_variable, fill=the_variable)) + 
     geom_bar(stat="bin") 

Powinieneś być w stanie usunąć denerwujące NA na swojej działce. Mam nadzieję, że to działa :)

+0

Dzięki, Gregor. Naprawiłem kody. –