Note that the directories used to store data are likely different on your computer, and such references will need to be changed before using any such code.
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
-- Attaching packages ---------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5 v purrr 0.3.4
v tibble 3.1.2 v dplyr 1.0.7
v tidyr 1.1.3 v stringr 1.4.0
v readr 1.4.0 v forcats 0.5.1
-- Conflicts ------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
library(magrittr)
Attaching package: ‘magrittr’
The following object is masked from ‘package:purrr’:
set_names
The following object is masked from ‘package:tidyr’:
extract
df <- read.csv("../../Data/About you (Responses) - Form Responses 1-Edit.csv") %>%
rename(country_name=Where.did.you.grow.up...country.or.region.,
cafe=What.is.your.favorite.cafe..coffee.shop..tea.shop..etc....N.A.if.you.don.t.have.one.)
ll <- read_tsv("../../Data/countries_latlon.csv") %>%
rename(country_name=name)
-- Column specification ---------------------------------------------------------------------------------------------------------------------------------------
cols(
country = col_character(),
latitude = col_double(),
longitude = col_double(),
name = col_character()
)
df %<>% left_join(ll)
Joining, by = "country_name"
library(leaflet)
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
leaflet(df) %>%
setView(lng = 103.8198, lat = 1.3521, zoom = 1) %>%
addTiles() %>%
addMarkers(lng = ~longitude, lat = ~latitude, clusterOptions = markerClusterOptions(), label=~country_name)
NA
# Note: The below code only works when run at SMU
library(jsonlite)
Attaching package: ‘jsonlite’
The following object is masked from ‘package:purrr’:
flatten
soa_ll <- c(1.2956192, 103.8498277)
find_cafe_ll <- function(coord_ll, radius, keyword) {
# setup
coord <- paste(coord_ll[1],coord_ll[2],sep=",")
baseurl <- "https://maps.googleapis.com/maps/api/place/findplacefromtext/json?"
# You'll need your own API key on Google Cloud to replicate this.
# The good news is that the first $200 USD in charges are waived per month.
api_key <- readRDS('google_maps_api_key.rds')
# query
q <- paste(baseurl,"input=", URLencode(keyword),"&inputtype=textquery","&locationbias=circle:",radius,"@",coord,"&fields=formatted_address,name,rating,geometry,place_id","&key=",api_key, sep="")
#print(q)
# GET data
data1<-fromJSON(q)
# Check if found
if (data1$status == "ZERO_RESULTS") {
return(NULL)
}
# Return as a data.frame
df_return <- data.frame(cafe=keyword,
cafe_name=data1$candidates$name,
lat=data1$candidates$geometry$location$lat,
long=data1$candidates$geometry$location$lng,
place_id=data1$candidates$place_id,
address=data1$candidates$formatted_address,
rating=ifelse(is.null(data1$candidates$rating), NA, data1$candidates$rating))
return(df_return)
}
cafes = unique(df$cafe)
cafes = cafes[cafes!="NA" & cafes!="N/A" & cafes != "na" & cafes != "n/a" & !is.na(cafes) & cafes != ""]
if(!file.exists("google_maps_query.rds")) {
first = T
for (cafe in cafes) {
cafe_data <- find_cafe_ll(soa_ll,radius = 1000,cafe)
if (!is.null(cafe_data)) {
if (first) {
df_cafe <- cafe_data
first <- F
} else {
df_cafe <- rbind(df_cafe,cafe_data)
}
}
}
saveRDS(df_cafe,"google_maps_query.rds")
} else {
df_cafe <- readRDS("google_maps_query.rds")
}
# Visualize Google maps data
df %>% left_join(df_cafe) %>%
filter(!is.na(place_id)) %>%
leaflet() %>%
setView(lng = 103.8498277, lat = 1.2956192, zoom = 14) %>%
addTiles() %>%
addMarkers(lng = ~long, lat = ~lat, clusterOptions = markerClusterOptions(),
label = ~paste0(cafe_name),
popup = ~paste0('<div style="font-size:18px; padding:10px; line-height:20px">Query: ',cafe,
'<br><a href="https://www.google.com/maps/search/?api=1&query=Google&query_place_id=',place_id,'">Link on Gmaps</a>',
'<br>Rating on Gmaps: ',rating,
'<br>Address: ',address,'</div>'))
Joining, by = "cafe"
library(waffle)
library(rlang)
Attaching package: ‘rlang’
The following objects are masked from ‘package:jsonlite’:
flatten, unbox
The following object is masked from ‘package:magrittr’:
set_names
The following objects are masked from ‘package:purrr’:
%@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl, flatten_raw, invoke, list_along, modify, prepend, splice
output_waffle_gg = function(data, cut=3, title="", ...) {
dots <- ensyms(...)
data2 <- data %>%
select(!!!dots) %>% # This is a quosure.
unlist()
data2 <- data.frame(cats=data2)
data2 %<>%
filter(cats != '') %>%
group_by(cats) %>%
mutate(count = n()) %>%
slice(1) %>%
ungroup()
cut = 0
cells_cut = 0
while (nrow(data2) > 10) {
cut <- cut + 1
cells_cut = cells_cut + sum(filter(data2,count <= cut)$count)
data2 %<>% filter(count > cut)
}
data2 %>%
ggplot(aes(fill=cats, values=count)) +
geom_waffle(color="white", n_rows=5, size=1.125) +
scale_x_discrete(expand=c(0,0)) +
scale_y_discrete(expand=c(0,0)) +
ggthemes::scale_fill_tableau(name=NULL) +
labs(title=title, x = paste0("1 square is 1 response; Only responses with >",cut," (",cells_cut," items omitted)"))
}
df %>% output_waffle_gg(cut=2, "", Hobby.Norm1, Hobby.Norm2, Hobby.Norm3)
df %>% output_waffle_gg(3, "", Pro.Norm1, Pro.Norm2)
df %>% output_waffle_gg(3, "", Con.Norm1)