2016-11-15 6 views
0

私の目標は、疾病対策センター(CDC)によってサポートされているwebsiteからのレジオネラ症症例の1996年1週から46週までの時系列を取得することです)の米国。同僚は、以下のコードでレジオネラ症の例が含まれているテーブルのみこすりしようとした。しかしRSOCrataまたはXMLを使用してRSOCrataまたはXMLを使用してデータを要求するR

#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を使用するのが最善かもしれ思いましたWebページが変更されます。このようにして、レイアウトを変更するタイミングと、それに応じてWebスクレイピングコードを調整する方法を把握するために、テーブルを組み合わせる必要はありません。したがって、私はAPIからデータを取得しようとしました。

ここで、データを提供するCDCから2つのヘルプドキュメントが見つかりました。 1つは、RSOCrataを使用してhereを見ることができる2014年以降のデータを提供するように見えますが、他の命令はより一般化されており、httpでのXML形式の要求を使用します(here参照)。私は見つけられませんでした。それから、私はRSocrataにつまずいて、代わりにそれを試みることに決めました。しかし、私が設定したトークンIDとともに提供されるコードスニペットは機能しませんでした。

install.packages("RSocrata") 

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

どうすればこの問題を解決できますか?私の最終目標は、週ごとに州ごとに1996年から2016年までのレジオネラ症例の表です。

答えて

0

私はthis issue thread in the RSocrata GitHub repoをチェックアウトすることをお勧めします。ここでは、トークンをRSocrataライブラリに渡すことで同様の問題について議論しています。

一方、実際には$$app_tokenパラメータを省略することができます。リクエストが氾濫していない限り、正常に動作します。アプリトークンを使用せずにスニークすることができる制限があります。

+0

@christmetcalf $$ app_tokenパラメータを削除しましたが、それでも動作しませんでした。私は同じエラーを受け取りましたread.socrata:text/plainはサポートされているデータフォーマットではありません。私はスレッドを通過し、私のシナリオに役立つものは何も見つかりませんでした。私が実行しようとしているコードはSocrataのページから直接得られます。 – Meli

+0

ああ、RSocrataコードスニペットにバグがあるようです。 URLには 'https:// data.cdc.gov/resource/cmap-p7au.csv'のように' .csv'があります。 – chrismetcalf

+0

@christmetcalf最後に.jsonがあるはずです。それは動作しますが、私が探していたすべてのデータを提供するわけではありませんので、私は代替案を探します。私はこのウェブアプリケーションのすべてのlegionellosisデータを必要としています。https:// wonder.cdc.gov/mmwr/mmwrmorb.asp/ – Meli

関連する問題