2016-10-06 2 views
0

私はRでプログラミングするのがかなり新しく、かなり基本的な質問があります。Rデータフレームからベクトルを返す

XMLライブラリを使用して、次のXMLドキュメントをデータフレームhttp://www.xmldatasets.net/temp/179681356453762.xml にロードしました。私の質問は、彼/彼女の州の上院議員の名前を返す関数を作成する方法についてですか?

つまり、戻り値はその状態の上院議員のベクトルになるsenatorName(state)のようなものです。

+1

XMLは苦しいですが、[Sunlight FoundationはCSVと同じ情報を公開しています。](https://sunlightlabs.github.io/congress/#legislator-spreadsheet)(または、必要に応じてAPI)'congress < - read.csv( 'http://unitedstates.sunlightfoundation.com/legislators/legislators.csv')'で直接取得し、次に通常どおりサブセットすることができます。 'congress [congress $ title == 'Sen'&congress $ state == 'CA'、1:5]' – alistaire

答えて

1

多分このような何か?取得するには

tg[tg$state=="TX",] 

:あなたは1つのあなただけの変換されたXMLテーブルを取ることができるコラム、tg、およびタイプに家族の名前と最初の名前を崩壊させたくない場合は

library(XML) 
tg<-xmlToDataFrame("http://www.xmldatasets.net/temp/179681356453762.xml") 

mt<-data.frame(fname=cbind(apply(tg[,2:3],1,function(x) paste0(x,collapse=", "))),state=tg$state) 

mt[mt$state=="TX",] 
        fname state 
28   Cornyn, John TX 
43 Hutchison, Kay Bailey TX 

としては、以下のコメントテキサス州の上院議員に関するすべての情報。そして、あなたは唯一の名前と状態を必要とする場合は、としてそれをサブセットができます:あなたは、コンソールに状態名を入力し、名を取得できるようにしたいと述べている場合は

tg[tg$state=="TX",c(2:3,5)] 

for (j in unique(tg$state)){ 
    assign(j,tg[tg$state==j,c(2,3,5)]) 
} 

次に、状態名を入力します。 MT、および出力を得る:

> MT 
    last_name first_name state 
5  Baucus  Max MT 
89 Tester  Jon MT 

をそして、あなたはまた、この機能を行うことができます(あなたが好きならば、あるいはAPI)

senatorName<-function (x) tg[which(tg$state==paste0(x)),c(2:3,5)]; 
> senatorName("TX") 
     last_name first_name state 
    28 Cornyn  John TX 
    43 Hutchison Kay Bailey TX 
+0

これは私が必要なものに近いです。コードの長い中間行が何をしているのか分かりませんが、私はこれを関数として必要とします。ここでは省略形を入力できます。状態のハードコーディングとは対照的に –

+0

明確にしてください。あなたが言っていることはむしろあいまいです。長いコード行は、姓と名を1つの列に壊すだけです。しかし、あなたはこれを行い、上手くいくことができます:tg [tg $ state == "TX"、] @KyleWeise – nadizan

+0

あなたの例では、 "TX"を状態としてハードコーディングしました。私は関数の点でこれを必要とします。ここで私は州の略語を入力できます。 (.ie、TX、HI、CT)を返し、対応する上院議員を返す –

1

XMLは、痛みのようなものが、the Sunlight Foundation publishes that same information as a CSVです。あなただけの

congress <- read.csv('http://unitedstates.sunlightfoundation.com/legislators/legislators.csv') 

と直接それをつかむと、その後通常通りのサブセット、またはそうする機能を行うことができます。

find_senators <- function(state){ 
    sens <- congress[congress$title == 'Sen' & 
        congress$state == state & 
        congress$in_office == 1, 1:5] 
    unname(apply(sens, 1, function(x){paste(x[x != ''], collapse = ' ')})) 
} 

find_senators("CA") 
## [1] "Sen Barbara Boxer" "Sen Dianne Feinstein" 

find_senators("IL") 
## [1] "Sen Richard J. Durbin" "Sen Mark Steven Kirk" 
0

それは良い習慣の開発を開始するには良い時間です:

library(xml2) 
library(purrr) 
library(dplyr) 

doc <- read_xml("http://www.senate.gov/general/contact_information/senators_cfm.xml") 

xml_find_all(doc, ".//member") %>% 
    map_df(function(x) { 
    set_names(xml_text(xml_children(x)), xml_name(xml_children(x))) %>% 
     as.list() 
    }) -> senators 

senator_name <- function(df, x) { 
    filter(df, state==x) %>% 
    mutate(senator=sprintf("%s %s", first_name, last_name)) %>% 
    select(senator) %>% 
    flatten_chr() 
} 

senator_name(senators, "TX") 

XMLは本当に苦痛ではありません。残念なことに、それをかなり覗いてくるでしょうから、練習をすることは価値があります。

イディオムを使用すると、実行する操作の観点から考えると、サブセットの構文にはあまり依存しないことになります。このような構文は問題ありませんが、Rでさらに分析作業を開始すると、dplyrを学んだことをうれしく思います。

また、/と操作するためにデータとパラメータを渡すことに慣れている必要があります。変更があるまではコピーが作成されません。この方法でグローバルオブジェクトに頼っているわけではありません。

大きなデータセットまたは反復操作の場合は、ラムダ関数の一時変数にxml_children(x)を代入し、データを2回生成します。

関連する問題