2017-06-23 13 views
0

私は、retrosheet boxscoreで生成されたXMLファイルをSQLテーブルに挿入できるデータフレームに変換しようとしています。私はそこでの方法のほとんどですが、私は中間xmlノードの属性を取得する方法を把握することはできません。以下は例ですが、うまくいけば正しく貼り付けました。私がつかみたいのは、game_id、id(プレイヤーから)、そしてフルバッティングセクションです。ここで子ノードの属性値を取得

<boxscores> 
<boxscore game_id="CHA191204110" date="1912/04/11" site="CHI10" 
visitor="SLA" visitor_city="St.Louis" visitor_name="Browns" home="CHA" 
home_city="Chicago" home_name="White Sox" start_time="0:00PM" 
day_night="day" temperature="0" wind_direction="unknown" wind_speed="-1" 
field_condition="unknown" precip="unknown" sky="unknown" time_of_game="110" 
attendance="30000" umpire_hp="evanb901" umpire_1b="eganr101" umpire_2b="" 
umpire_3b="" > 
<linescore away_runs="2" away_hits="7" away_errors="1" home_runs="6" 
home_hits="10" home_errors="1"> 
<inning_line_score away="0" home="0" inning="1"/> 
<inning_line_score away="0" home="0" inning="2"/> 
<inning_line_score away="0" home="1" inning="3"/> 
<inning_line_score away="0" home="0" inning="4"/> 
<inning_line_score away="2" home="0" inning="5"/> 
<inning_line_score away="0" home="1" inning="6"/> 
<inning_line_score away="0" home="1" inning="7"/> 
<inning_line_score away="0" home="3" inning="8"/> 
<inning_line_score away="0" home="x" inning="9"/> 
</linescore> 
<players team="SLA" lob="5" dp="0" tp="0" risp_ab="0" risp_h="0"> 

<player id="shotb101" lname="Shotton" fname="Burt" slot="1" seq="1" pos="8"> 
    <batting ab="4" r="0" h="0" d="0" t="0" hr="0" bi="0" bi2out="-1" bb="0" ibb="-1" so="3" gdp="-1" hp="0" sh="0" sf="-1" sb="0" cs="-1" /> 
    <fielding pos="8" outs="24" po="1" a="0" e="0" dp="0" tp="0" bip="-1" bf="-1" /> 
</player> 
<player id="austj101" lname="Austin" fname="Jimmy" slot="2" seq="1" pos="5"> 
    <batting ab="4" r="0" h="1" d="0" t="0" hr="0" bi="0" bi2out="-1" bb="0" ibb="-1" so="1" gdp="-1" hp="0" sh="0" sf="-1" sb="0" cs="-1" /> 
    <fielding pos="5" outs="24" po="0" a="3" e="0" dp="0" tp="0" bip="-1" bf="-1" /> 
    </player> 
<player id="stovg101" lname="Stovall" fname="George" slot="3" seq="1" pos="3" > 
    <batting ab="4" r="0" h="1" d="0" t="0" hr="0" bi="0" bi2out="-1" bb="0" ibb="-1" so="0" gdp="-1" hp="0" sh="0" sf="-1" sb="0" cs="-1" /> 
    <fielding pos="3" outs="24" po="11" a="0" e="0" dp="0" tp="0" bip="-1" bf="-1" /> 
</player> 

</players> 
</boxscore> 
</boxscores> 

私は

box <- 
read_xml("Q:\\Sabermetrics\\Retrosheet\\download.folder\\unzipped\\1912.xml") 

atbat <- xml_find_all(box, "//boxscore") 

bind_rows(lapply(atbat, function(x) { 

player <- try(xml_find_all(x, "./players/player/batting"), silent=FALSE) 

if (inherits(player, "try-error") | 
    length(player) == 0) return(NULL) 

bind_rows(lapply(player, function(y) { 
    data.frame(t(xml_attrs(y)), stringsAsFactors=FALSE) 
})) -> player_dat 

game_id <- try(xml_attr(x, "game_id")) 

if (inherits(game_id, "try-error") | 
    length(game_id) == 0) return(NULL) 

player_dat$game_id <- game_id 

player_dat 

})) -> player 

を使用しているコードは、私がgame_idコードを複製して、つかん試してみたこの

game_id  player_id  ab r h d .... 
CHA191204110 shotb101  4  0 0 0 .... 
CHA191204110 austj101  4  0 1 0 .... 
CHA191204110 stovg101  4  0 0 0 .... 

のようなもので終わるしたいですプレーヤーからの「id」は動作しません。私はパス./players/player[@id]と./players/player/@idを使って試しましたが、どちらもうまくいきません。私はまだ@idを使ってみましたが、まだNAです。

あなたは

答えて

0

ん...このヘルプ私は私が間違って何をやったかわからないんだけど、私はちょうどそれがスティックかどうかを確認するために壁にものを投げていますか?

xml <- xmlParse('Q:\\Sabermetrics\\Retrosheet\\download.folder\\unzipped\\1912.xml') 
lxml <- xmlToList(xml) 
df <- cbind(t(lxml$boxscore$.attrs),t(data.frame(unlist(lxml$boxscore$players)))) 

さらに引数をcbind()に渡すことで、XMLから追加情報を抽出できます。

私はあなたが複数のxmlを反復していると思いますので、原理的にはsapply()にこれをラップし、次にすべてを1つのdfに集めることができます:library(plyr);do.call(rbind.fill, your_df_list)

+0

これは近いですが、とにかく各プレーヤーのセクションを新しい行に表示させることはありますか? –

+0

ああ、確かに、はい、複数のプレイヤーがいるところでサンプルXMLを貼り付けることはできますか? – Majo

関連する問題