1

XMLパッケージを使用してRオブジェクトに基づいてXMLツリーを作成することを調査しています。

私がやりたいことの1つは、次のようなデータフレームから情報を抽出することです。

frame2
rules     support confidence      lift
1      1 0.010230179  1.0000000 78.200000
2      2 0.010230179  0.8000000 78.200000
3      3 0.010230179  1.0000000 65.166667
4      4 0.010230179  0.6666667 65.166667
5      5 0.012787724  0.8333333 54.305556
6      6 0.012787724  0.8333333 54.305556
7      7 0.010230179  0.6666667 26.066667
8      8 0.010230179  0.4000000 26.066667
9      9 0.007672634  0.6000000 26.066667
10    10 0.007672634  0.3333333 26.066667
11    11 0.007672634  0.6000000 21.327273
12    12 0.007672634  0.2727273 21.327273
13    13 0.007672634  0.4285714 16.757143
14    14 0.007672634  0.3000000 16.757143
15    15 0.010230179  0.6666667 26.066667
16    16 0.010230179  0.4000000 26.066667
17    17 0.007672634  0.3333333 10.861111
18    18 0.007672634  0.2500000 10.861111
19    19 0.007672634  0.3750000 13.329545
20    20 0.007672634  0.2727273 13.329545
21    21 0.007672634  0.3750000 11.278846
22    22 0.007672634  0.2307692 11.278846
23    23 0.007672634  0.3750000 18.328125
24    24 0.007672634  0.3750000 18.328125
25    25 0.007672634  0.4285714 13.964286
26    26 0.007672634  0.2500000 13.964286
27    27 0.007672634  0.4285714 11.171429
28    28 0.007672634  0.2000000 11.171429
29    29 0.007672634  0.3000000 11.730000
30    30 0.007672634  0.3000000 11.730000
31    31 0.007672634  0.2727273  8.886364
32    32 0.007672634  0.2500000  8.886364
33    33 0.007672634  0.3333333 10.861111
34    34 0.007672634  0.2500000 10.861111
35    35 0.007672634  0.3000000 11.730000
36    36 0.007672634  0.3000000 11.730000
37    37 0.007672634  0.3000000  9.775000
38    38 0.007672634  0.2500000  9.775000
39    39 0.007672634  0.2727273  8.202797
40    40 0.007672634  0.2307692  8.202797
41    41 0.007672634  0.2307692  8.202797
42    42 0.007672634  0.2727273  8.202797
43    43 0.007672634  0.2307692  6.015385
44    44 0.007672634  0.2000000  6.015385
45    45 0.010230179  0.8000000 31.280000
46    46 0.010230179  1.0000000 65.166667
47    47 0.010230179  1.0000000 65.166667

次のようなXMLツリーに

root
  1
   support=0.010230179
   confidence=1.0000000 
   lift=78.200000
  /1
  2 
   support=0.010230179
   confidence=0.8000000
   lift=78.200000
  /2
  47
   support=0.010230179
   confidence=1.0000000
   lift=65.166667
  /47
/root

これまでに、次のコマンドを使用して47個の子ノードを作成することができました。

root<-newXMLNode("root")
sapply(frame2$rules,newXMLNode,parent=root)

ただし、適切な値でサポート、信頼、リフトの要素を追加することはできませんでした。

これにより、次の2つの質問をすることになります。

  1. 47個の子ノードのそれぞれについて、要素または属性のサポート、信頼性、およびリフトをどのように定義できますか?

  2. frame2にある値に基づいてそれぞれの値を入力するにはどうすればよいですか?

どうもありがとうございます。

4

1 に答える 1

1

基本的な問題:

  • データを行ごとにループさせたいとします。

applyそこにあなたの友達がいます:

> invisible(apply(df, MARGIN=1, print))
      rules     support  confidence        lift 
 1.00000000  0.01023018  1.00000000 78.20000000 
      rules     support  confidence        lift 
 2.00000000  0.01023018  0.80000000 78.20000000 
      rules     support  confidence        lift 
 3.00000000  0.01023018  1.00000000 65.16666700 
  • これらの行を他の列の属性とともにXML要素(rules属性にちなんで名付けられた)に変換したい

newXMLNodeattrs名前付きベクトルをロデュース属性に取る引数があります

> newXMLNode(as.character(df[1,"rules"]), attrs=df[1,])    
<1 rules="1" support="0.010230179" confidence="1" lift="78.2"/>

質問に正確に答えるために、サブセット化によってあなたの属性を取り除く必要もありますrulesが、それは私をあまり幸せにしません-

> newXMLNode(as.character(df[1,"rules"]), attrs=df[1,-1])    
<1 support="0.010230179" confidence="1" lift="78.2"/>

とにかく予測できない要素名でXMLスキーマを作成しないことをお勧めします(通常、受信者コードで解析/検証するのは難しいため)、これを次のようにエンコードすることをお勧めします

> newXMLNode("observation", attrs=df[1,])    
<observation rule="1" support="0.010230179" confidence="1" lift="78.2"/>

上記の2つを組み合わせて、ルートノードを追加します。

> children <- apply(df, MARGIN=1, function(row) newXMLNode("observation", attrs=row))
> root <- newXMLNode("frame2", .children = children)

> root
<frame2>
  <observation rules="1" support="0.010230179" confidence="1" lift="78.2"/>
  <observation rules="2" support="0.010230179" confidence="0.8" lift="78.2"/>
  <observation rules="3" support="0.010230179" confidence="1" lift="65.166667"/>
</frame2> 
于 2012-08-20T16:27:17.723 に答える