私は、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です。
あなたは
これは近いですが、とにかく各プレーヤーのセクションを新しい行に表示させることはありますか? –
ああ、確かに、はい、複数のプレイヤーがいるところでサンプルXMLを貼り付けることはできますか? – Majo