2015-10-01 23 views
6

Nie jestem pewien, dlaczego żaden z moich punktów danych nie pojawia się na mapie.W jaki sposób geom_point usuwa wiersze zawierające brakujące wartości?

Store_ID visits CRIND_CC ISCC EBITDAR top_bottom Latitude Longitude 
     (int) (int) (int) (int) (dbl)  (chr)  (fctr)  (fctr) 
1  92 348 14819 39013 76449.15  top 41.731373 -93.58184 
2  2035 289 15584 35961 72454.42  top 41.589428 -93.80785 
3  50 266 14117 27262 49775.02  top 41.559017 -93.77287 
4  156 266  7797 25095 28645.95  top 41.6143 -93.834404 
5  66 234  8314 18718 46325.12  top 41.6002 -93.779236 
6  207  18  2159 17999 20097.99  bottom 41.636208 -93.531876 
7  59  23 10547 28806 52168.07  bottom 41.56153 -93.88083 
8  101  23  1469 11611 7325.45  bottom 41.20982 -93.84298 
9  130  26  2670 13561 14348.98  bottom 41.614517 -93.65789 
10  130  26  2670 13561 14348.98  bottom 41.6145172 -93.65789 
11  24  27 17916 41721 69991.10  bottom 41.597134 -93.49263 

> dput(droplevels(top_bottom)) 
structure(list(Store_ID = c(92L, 2035L, 50L, 156L, 66L, 207L, 
59L, 101L, 130L, 130L, 24L), visits = c(348L, 289L, 266L, 266L, 
234L, 18L, 23L, 23L, 26L, 26L, 27L), CRIND_CC = c(14819L, 15584L, 
14117L, 7797L, 8314L, 2159L, 10547L, 1469L, 2670L, 2670L, 17916L 
), ISCC = c(39013L, 35961L, 27262L, 25095L, 18718L, 17999L, 28806L, 
11611L, 13561L, 13561L, 41721L), EBITDAR = c(76449.15, 72454.42, 
49775.02, 28645.95, 46325.12, 20097.99, 52168.07, 7325.45, 14348.98, 
14348.98, 69991.1), top_bottom = c("top", "top", "top", "top", 
"top", "bottom", "bottom", "bottom", "bottom", "bottom", "bottom" 
), Latitude = structure(c(11L, 4L, 2L, 7L, 6L, 10L, 3L, 1L, 8L, 
9L, 5L), .Label = c("41.20982", "41.559017", "41.56153", "41.589428", 
"41.597134", "41.6002", "41.6143", "41.614517", "41.6145172", 
"41.636208", "41.731373"), class = "factor"), Longitude = structure(c(3L, 
7L, 5L, 8L, 6L, 2L, 10L, 9L, 4L, 4L, 1L), .Label = c("-93.49263", 
"-93.531876", "-93.58184", "-93.65789", "-93.77287", "-93.779236", 
"-93.80785", "-93.834404", "-93.84298", "-93.88083"), class = "factor")), row.names = c(NA, 
-11L), .Names = c("Store_ID", "visits", "CRIND_CC", "ISCC", "EBITDAR", 
"top_bottom", "Latitude", "Longitude"), class = c("tbl_df", "tbl", 
"data.frame")) 

Tworzenie działki:

map <- qmap('Des Moines') + 
     geom_point(data = top_bottom, aes(x = as.numeric(Longitude), 
        y = as.numeric(Latitude)), colour = top_bottom, size = 3) 

dostaję komunikat ostrzegawczy:

Removed 11 rows containing missing values (geom_point). 

Jednak ta działa bez użycia ggmap():

ggplot(top_bottom) + 
geom_point(aes(x = as.numeric(Longitude), y = as.numeric(Latitude)), 
      colour = top_bottom, size = 3) 

enter image description here

Jak uzyskać punkty do nałożenia na ggmap?

+1

Myślę, że istnieją punkty danych, które pozostają poza bbox obiektu qmap. Dlatego uważam, że niektóre punkty danych są automatycznie usuwane. – jazzurro

+0

To pytanie może być znacznie [poprawione] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), co prawdopodobnie dostarczy Ci więcej odpowiedzi. Po pierwsze, użyj 'dput' zamiast wklejać dane. Po drugie, proszę wymienić pakiety używane w kodzie. –

+0

To prawda. Podczas konwersji z czynnika na numeryczny w linii 'geom_point' zmienia wartość. Masz pomysł, jak sobie z tym poradzić? Nie mogę wyliczyć czynników, w przeciwnym razie pojawia się błąd "Dyskretne zmienne przypisane do skali ciągłej". – herkyonparade

Odpowiedz

5

Używasz as.numeric() z factor. Jak widać here, który podaje numer poziomu dla czynnika (a nie reprezentowanej liczby). Nic dziwnego, że wszystkie te poziomy nie są punktami na płótnie wyświetlanym dla "Des Moines".

Użyj as.numeric(as.character(Latitude)) i as.numeric(as.character(Longitude)), jako brzydki, jak się wydaje.

2

Widząc przykładowe dane, wydaje się, że istnieje jeden punkt danych, który nie pozostaje na obszarze mapy.

library(dplyr) 
library(ggplot2) 
library(ggmap) 

### You can find lon/lat for bbox using your ggmap object. 
### For instance, des1 <- ggmap(mymap1) 
### str(des1) 
### You could use bb2bbox() in the ggmap package to find lon/lat. 

filter(top_bottom, 
     between(Latitude, 41.27057, 41.92782), 
     between(Longitude, -94.04787, -93.16897)) -> inside 

setdiff(top_bottom, inside) 

# Store_ID visits CRIND_CC ISCC EBITDAR top_bottom Latitude Longitude 
#1  101  23  1469 11611 7325.45  bottom 41.20982 -93.84298 

Ponieważ stosowane qmap() bez określania zoom, nie wiem co miałeś poziom zoom. Pobawmy się trochę. W pierwszym przypadku brakuje jednego punktu danych; Removed 1 rows containing missing values (geom_point).

mymap1 <- get_map('Des Moines', zoom = 10) 

ggmap(mymap1) + 
geom_point(data = top_bottom, aes(x = as.numeric(Longitude), 
      y = as.numeric(Latitude)), colour = top_bottom, size = 3) 

enter image description here

mymap2 <- get_map('Des Moines', zoom = 9) 

ggmap(mymap2) + 
geom_point(data = top_bottom, aes(x = as.numeric(Longitude), 
      y = as.numeric(Latitude)), colour = top_bottom, size = 3) 

enter image description here

więc kluczową sprawą, jak sądzę, jest to, że chcesz, aby upewnić się wybrać odpowiedni poziom powiększenia dla danych przedstawionych. W tym celu możesz określić powiększenie qmap(). Mam nadzieję, że to Ci pomoże.

DANE

top_bottom <- structure(list(Store_ID = c(92L, 2035L, 50L, 156L, 66L, 207L, 
59L, 101L, 130L, 130L, 24L), visits = c(348L, 289L, 266L, 266L, 
234L, 18L, 23L, 23L, 26L, 26L, 27L), CRIND_CC = c(14819L, 15584L, 
14117L, 7797L, 8314L, 2159L, 10547L, 1469L, 2670L, 2670L, 17916L 
), ISCC = c(39013L, 35961L, 27262L, 25095L, 18718L, 17999L, 28806L, 
11611L, 13561L, 13561L, 41721L), EBITDAR = c(76449.15, 72454.42, 
49775.02, 28645.95, 46325.12, 20097.99, 52168.07, 7325.45, 14348.98, 
14348.98, 69991.1), top_bottom = structure(c(2L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("bottom", "top"), class = "factor"), 
Latitude = c(41.731373, 41.589428, 41.559017, 41.6143, 41.6002, 
41.636208, 41.56153, 41.20982, 41.614517, 41.6145172, 41.597134 
), Longitude = c(-93.58184, -93.80785, -93.77287, -93.834404, 
-93.779236, -93.531876, -93.88083, -93.84298, -93.65789, 
-93.65789, -93.49263)), .Names = c("Store_ID", "visits", 
"CRIND_CC", "ISCC", "EBITDAR", "top_bottom", "Latitude", "Longitude" 
), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
"6", "7", "8", "9", "10", "11")) 
Powiązane problemy