2016-10-06 4 views
0

Я довольно новичок в программировании в R, и у меня есть довольно простой вопрос.Возвращающийся вектор из R dataframe

Я загрузил следующий XML-документ в dataframe http://www.xmldatasets.net/temp/179681356453762.xml с использованием библиотеки XML. Мой вопрос в том, как я хотел бы создать функцию, которая вернула имя сенатора, учитывая его состояние?

i.e. Что-то вроде senatorName (state), где возвращаемое значение будет вектором сенатора (ов) этого состояния.

+1

XML - это боль, но [Фонд Sunlight публикует ту же информацию, что и 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

Возможно, что-то вроде этого?

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 

Как прокомментировал ниже, если вы не хотите, чтобы свернуть фамилию и имя в одной колонке вы могли бы просто взять преобразованный XML-таблицу, tg и тип:

tg[tg$state=="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 

И вы также можете сделать функцию этого:

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

Просьба уточнить. То, что вы говорите, довольно неоднозначно. Длинная строка кода - это просто крах фамилии и имени для одного столбца. Однако вы могли бы просто сделать это и быть в порядке: tg [tg $ state == "TX",] @KyleWeise – nadizan

+0

В вашем примере у вас жестко закодированный «TX» как состояние. Мне нужно это с точки зрения функции, где я могу ввести аббревиатуру состояния. (.ie TX или HI или CT), и он возвращает соответствующие сенаторы –

1

XML является своего рода боль, но the Sunlight Foundation publishes that same information as a CSV (или API, если вы хотите). Вы можете получить его непосредственно только с

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 действительно не так болезненен, и вы, к сожалению, столкнетесь с ним совсем немного, поэтому получение некоторой практики стоит того, ИМО.

Использование иконок dplyr поможет вам думать в терминах операций, которые вы хотите выполнить, и меньше полагаться на синтаксис подмножества. Такой синтаксис прекрасен, но когда вы начинаете делать больше аналитических работ в R, вы будете рады, что узнали dplyr.

Вы также должны привыкнуть к передаче данных и параметров для работы с/с. Никакая копия не создается до тех пор, пока не будет изменений, и таким образом вы не будете полагаться на глобальные объекты.

Для больших наборов данных или повторных операций я назначил xml_children(x) временной переменной в лямбда-функции и сгенерировал данные дважды.

Смежные вопросы