2017-03-09 15 views
0

XMLの構文解析が新しく、いくつかのバスケットボールNBAのsportVUデータを解析しようとしています。私は(要約形式)などに見えるXMLファイルを持っている:各ノードについて、XMLパッケージを使用して子ノードの数を計算するR

<quarter number="1"> 
    <possession team-id="30" points="3"/> 
    <possession team-id="23" points="1"/> 
    <possession team-id="30" points="2"/> 
</quarter> 
<quarter number="2"> 
    <possession team-id="23" points="3"/> 
    <possession team-id="30" points="2"/> 
</quarter> 
<quarter number="3"> 
    <possession team-id="30" points="1"/> 
    <possession team-id="30" points="1"/> 
    <possession team-id="30" points="1"/> 
    <possession team-id="23" points="2"/> 
</quarter> 
<quarter number="4"> 
    <possession team-id="23" points="2"/> 
</quarter> 

私のような、1列としてチーム-IDを持つデータフレーム、および別の列としてポイントの数を作成しました:

library(XML) 
data = xmlParse("myXMLfile.XML") 

my_df <- data.frame(
    team.id = sapply(data["//quarter/possession/@team-id"], as, "integer"), 
    points = sapply(data["//quarter/possession/@points"], as, "integer") 
) 

my_df 
    team.id points 
1  30  3 
2  23  1 
3  30  2 
4  23  3 
5  30  2 
6  30  1 
7  30  1 
8  30  1 
9  23  2 
10  23  2 

私は、これまでのように見えるようにデータフレームを更新してしまうラベル四半期、第三列を追加したいと思います:

my_new_df 
    team.id points quarter 
1  30  3  1 
2  23  1  1  
3  30  2  1 
4  23  3  2 
5  30  2  2 
6  30  1  3 
7  30  1  3 
8  30  1  3 
9  23  2  3 
10  23  2  4 

私はこれを行うことができるようにする最も簡単な方法を把握、あなたをつかむことですベクトル内の固有の四分数を計算し、各四分節ノードの下にある子ノードの数だけベクトルを繰り返します。私はこれをどのように達成できるのか誰も知っていますか?私は、XMLパッケージを含まない一般的に異なるアプローチにオープンしています(たとえば、xml2ソリューションがある場合など)。

ありがとうございます!

答えて

1

元文書であるdata(これは私がdocと呼ぶ)から始まるように見えます。最初に、希望の情報を目的のフォームに取得するための小さなヘルパー機能。

helper <- function(x) { 
    as.data.frame.list(c(xmlAttrs(x), quarter = unname(xmlAttrs(xmlParent(x))))) 
} 

今、私たちはlapply()とノード間で、当社のヘルパー関数を実行し、rbind()とのデータフレームに結果のリストをもたらすことができます。

do.call(rbind, lapply(doc["//quarter/*"], helper)) 
# team.id points quarter 
# 1  30  3  1 
# 2  23  1  1 
# 3  30  2  1 
# 4  23  3  2 
# 5  30  2  2 
# 6  30  1  3 
# 7  30  1  3 
# 8  30  1  3 
# 9  23  2  3 
# 10  23  2  4 

データ:このような

library(XML) 
doc <- htmlParse('<quarter number="1"> 
    <possession team-id="30" points="3"/> 
    <possession team-id="23" points="1"/> 
    <possession team-id="30" points="2"/> 
</quarter> 
<quarter number="2"> 
    <possession team-id="23" points="3"/> 
    <possession team-id="30" points="2"/> 
</quarter> 
<quarter number="3"> 
    <possession team-id="30" points="1"/> 
    <possession team-id="30" points="1"/> 
    <possession team-id="30" points="1"/> 
    <possession team-id="23" points="2"/> 
</quarter> 
<quarter number="4"> 
    <possession team-id="23" points="2"/> 
</quarter>') 
+0

ありがとうございました。 xpathApplyは、XMLパッケージを使用してXML文書を解析する強力な方法です。私はそれらがたくさん使われているようだ。 – Canovice

+0

@Canovice - それは浮き沈みがあります:) –

0

何かが私の意見ではない最大の解決策とはいえ、動作しているようです。 XML :: xmlChildren関数を使用します。

zed = possessions["//quarter"] 
unlist(lapply(zed, FUN = function(x) length(XML::xmlChildren(x)))) 

3 2 4 1 
関連する問題