Yelp Fusion API позволяет извлекать 50 строк за раз в R, но вы можете пройтись по циклу, изменив набор смещения. Если я использую
library(yelpr)
Key <- ***
NYC_Restaurants <- business_search(api_key = key,
location = 'New York',
term = "restaurants",
offset = 0,
limit = 50)
и продолжайте увеличивать смещение, добавляя 50 каждый раз, когда я могу получить все данные, которые мне нужны. Однако я знаю, что должен быть способ написать цикл.
я пытался
restaurant_function <- function(location, term){
business_search(api_key = key,
location = location,
term = term,
offset = offset,
limit = 50)
}
NYC_Restaurants <- for (offset in seq(0,1000,50)) {
restaurant_function('New York','restaurants')
}
и он просто возвращает пустой набор. Буду очень признателен за любую помощь и понимание того, что я делаю неправильно. Спасибо.





У меня нет ключа API, поэтому я не могу воспроизвести это, но документ кажется довольно ясным: Yelp бизнес_поиск
Я предполагаю, что проблема связана с вашим циклом for, и вы не указываете смещение в функции.
key = "api_key"
restaurant_function <- function(key, location, term, offset){
business_search(api_key = key,
location = location,
term = term,
offset = offset,
limit = 50)
}
NYC_Restaurants <- data.frame()
for (offset_val in seq(0,1000,50)) {
temp <- restaurant_function(key, 'New York','restaurants', offset_val)
NYC_Restaurants <- rbind(NYC_Restaurants, temp)
}
print(NYC_Restaurants)
Вы также можете попробовать установить смещение как глобальную переменную:
restaurant_function <- function(location, term){
business_search(api_key = key,
location = location,
term = term,
offset = offset,
limit = 50)
}
NYC_Restaurants <- data.frame()
for (offset_val in seq(0,1000,50)) {
offset <<- offset_val
temp <- restaurant_function('New York','restaurants')
NYC_Restaurants <- rbind(NYC_Restaurants, temp)
}
print(NYC_Restaurants)
Надеюсь это поможет.
Возвращает ли business_search фрейм данных? Если это так, попробуйте использовать dplyr::bind_rows или удалите row_id перед rbind, выполнив temp <- restaurant_function('New York','restaurants') %>% select(-row_id).
Использование функции creativename (спасибо):
restaurant_function <- function(key, location, term, offset){
business_search(api_key = key,
location = location,
term = term,
offset = offset,
limit = 50)
}
Я работал с коллегой, чтобы получить цикл, который вернет 1000 результатов во фрейм данных:
NYC_Restaurants <- data.frame()
for (offset_val in seq(0,1000,50)) {
print(offset_val)
temp <- restaurant_function(key, 'New York', 'restaurants', offset_val) %>%
.$businesses %>%
mutate(categories = map(categories, flatten_chr)) %>%
mutate(categories = lapply(categories, paste, collapse = ", ") %>% unlist()) %>%
mutate(latitude = .$coordinates$latitude) %>%
mutate(longitude = .$coordinates$longitude) %>%
select(-coordinates) %>%
mutate(transactions = lapply(transactions, paste, collapse = ", ") %>% unlist()) %>%
mutate(address = .$location$display_address) %>%
mutate(address = lapply(address, paste, collapse = ", ") %>% unlist()) %>%
select(-location)
NYC_Restaurants <- bind_rows(NYC_Restaurants, temp)
}
Я принял ваше первое предложение, и он работает над итерацией, но R возвращает повторяющуюся ошибку row.names в rbind. Есть ли способ сделать n+1 для имен строк в каждом последовательном цикле? он идет от 1 до 50, а затем делает это снова, поэтому он пытается привязаться к фреймам данных с тем же идентификатором строки, который он не разрешает. Мне нужно, чтобы он прошел от 51 до 100 на втором цикле и так далее.