запрос данных из Центра контроля заболеваний с использованием RSocrata или XML в R

Моя цель — получить временной ряд случаев легионеллеза с 1 недели 1996 года по 46 неделю 2016 года из этого веб-сайт, поддерживаемый Центром контроля заболеваний (CDC) США. Сотрудник попытался очистить только таблицы, содержащие случаи легионеллеза, с помощью приведенного ниже кода:

#install.packages('rvest')
library(rvest)


## Code to get all URLS

getUrls <- function(y1,y2,clist){
root="https://wonder.cdc.gov/mmwr/mmwr_1995_2014.asp?mmwr_year="
root1="&mmwr_week="
root2="&mmwr_table=2"
root3="&request=Submit&mmwr_location="

urls <- NULL
 for (year in y1:y2){
  for (week in 1:53){
   for (part in clist) {
     urls <- c(urls,(paste(root,year,root1,week,root2,part,root3,sep="")))
    }
  }
}
      return(urls)
   }

TabList<-c("A","B") ## can change to get not just 2 parts of the table but as many as needed. 

WEB <- as.data.frame(getUrls(1996,2014,TabList)) # Only applies from 1996-2014. After 2014, the root url changes.
head(WEB)


#Example of how to extract data from a single webpage. 

url <- 'https://wonder.cdc.gov/mmwr/mmwr_1995_2014.asp?  mmwr_year=1996&mmwr_week=20&mmwr_table=2A&request=Submit&mmwr_location='

webpage <- read_html(url)
sb_table <- html_nodes(webpage, 'table')
sb <- html_table(sb_table, fill = TRUE)[[2]]

#test if Legionellosis is in the table. Returns a vector showing the columns index if the text is found. 
#Can use this command to filter only pages that you need and select only those columns.   
test <- grep("Leg", sb) 
sb <- sb[,c(1,test)]


### This code only works if you have 3 columns for headings. Need to adapt   to be more general for all tables.
#Get Column names
colnames(sb) <- paste(sb[2,], sb[3,], sep="_")
colnames(sb)[1] <- "Area"
sb <- sb[-c(1:3),]

#Remove commas from numbers so that you can then convert columns to numerical  values. Only important if numbers above 1000
Dat <- sapply(sb, FUN= function(x) 
as.character(gsub(",", "", as.character(x), fixed = TRUE)))

Dat<-as.data.frame(Dat, stringsAsFactors = FALSE)

Однако код не закончен, и я подумал, что лучше использовать API, поскольку структура и макет таблицы на веб-страницах меняются. Таким образом, нам не пришлось бы прочесывать таблицы, чтобы выяснить, когда меняется макет и как соответствующим образом настроить код парсинга веб-страниц. Таким образом, я попытался получить данные из API.

Теперь я нашел два справочных документа из CDC, которые предоставляют данные. Один из них предоставляет данные за 2014 год, которые можно увидеть здесь с использованием RSocrata, в то время как другая инструкция выглядит более обобщенной и использует запрос в формате XML через http, что можно увидеть здесь. Для запроса в формате XML через http требовался идентификатор из базы данных, который я не смог найти. Затем я наткнулся на RSocrata и решил попробовать вместо этого. Но фрагмент кода, предоставленный вместе с идентификатором токена, который я настроил, не сработал.

    install.packages("RSocrata")

    library("RSocrata")
    df <- read.socrata("https://data.cdc.gov/resource/cmap-p7au?$$app_token=tdWMkm9ddsLc6QKHvBP6aCiOA")

Как я могу это исправить? Моя конечная цель — составить таблицу случаев легионеллеза с 1996 по 2016 год на еженедельной основе по штатам.


person Meli    schedule 15.11.2016    source источник


Ответы (1)


Я рекомендую проверить эту ветку проблемы в репозитории RSocrata GitHub, где они обсуждаем аналогичную проблему с передачей токенов в библиотеку RSocrata.

А пока вы можете вообще не указывать параметр $$app_token, и пока вы не завалите нас запросами, он будет работать нормально. Существует ограничение регулирования, под которое вы можете проникнуть, не используя токен приложения.

person chrismetcalf    schedule 15.11.2016
comment
@christmetcalf Я удалил параметр $$app_token, но он все равно не работал. Я получил ту же ошибку Ошибка в read.socrata: text/plain не является поддерживаемым форматом данных. Я просмотрел ветку и не нашел ничего полезного для моего сценария. Код, который я пытаюсь запустить, взят непосредственно со страницы Socrata. - person Meli; 15.11.2016
comment
Ах, похоже, в фрагменте кода RSocrata есть ошибка. URL-адрес должен иметь .csv в конце, например https://data.cdc.gov/resource/cmap-p7au.csv - person chrismetcalf; 16.11.2016
comment
@christmetcalf URL-адрес должен иметь .json в конце. Он работает, но не предоставляет все данные, которые я искал, поэтому я буду искать альтернативу. Мне нужны все данные о легионеллезе из этого веб-приложения https://wonder.cdc.gov/mmwr/mmwrmorb.asp/ - person Meli; 18.11.2016
comment
@Meli Извините, но все, что у нас есть на data.cdc.gov, это 2014-2016: data.cdc.gov/ - person chrismetcalf; 19.11.2016
comment
Все нормально. В любом случае спасибо. - person Meli; 19.11.2016