将XML结果(从XML查询)转换为数据框

时间:2018-07-09 09:18:29

标签: r xml dataframe

我是R的完全初学者,无法找到我问题的具体答案,对不起,如果已经发布了这样的问题。

我正在寻找一种方法来转换直接从R上的XML查询获得的XML结果,并将其识别为“字符”类型的数据。

以下是我获得的那种结果的摘录:

XML结果:

<?xml version="1.0" standalone="yes"?>
<soft date="09/07/2018 12:11">
<name>
    <batch id="1">
        <p valeur="7"/>
        <lot id="754" esp="16" surf="15">
            <val1 valeur="710"/>
            <val2 valeur="260"/>
            <pval valeur="300"/>
            <res n="20">
                <year valeur="1998">
                    <y valeur="22.38"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="1999">
                    <y valeur="27.78"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2000">
                    <y valeur="29.75"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2001">
                    <y valeur="25.03"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2002">
                    <y valeur="30.07"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2003">
                    <y valeur="23.57"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2004">
                    <y valeur="19.47"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2005">
                    <y valeur="18.63"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2006">
                    <y valeur="26.73"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2007">
                    <y valeur="31.64"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2008">
                    <y valeur="27.11"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2009">
                    <y valeur="20.14"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2010">
                    <y valeur="27.87"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2011">
                    <y valeur="27.92"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2012">
                    <y valeur="23.05"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2013">
                    <y valeur="24.96"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2014">
                    <y valeur="29.86"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2015">
                    <y valeur="16.93"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2016">
                    <y valeur="24.52"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2017">
                    <y valeur="25.55"/>
                    <vol valeur="0"/>
                </year>
            </res>
        </lot>
        <lot id="755" esp="17" surf="15">
            <val1 valeur="600"/>
            <val2 valeur="530"/>
            <pval valeur="150"/>
            <res n="20">
                <year valeur="1998">
                    <y valeur="87.77"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="1999">
                    <y valeur="109.08"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2000">
                    <y valeur="109.23"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2001">
                    <y valeur="94.07"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2002">
                    <y valeur="97.64"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2003">
                    <y valeur="73.26"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2004">
                    <y valeur="86.13"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2005">
                    <y valeur="80.59"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2006">
                    <y valeur="66.57"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2007">
                    <y valeur="103.99"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2008">
                    <y valeur="109.23"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2009">
                    <y valeur="96.62"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2010">
                    <y valeur="85.96"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2011">
                    <y valeur="49.51"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2012">
                    <y valeur="107.55"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2013">
                    <y valeur="109.23"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2014">
                    <y valeur="91.19"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2015">
                    <y valeur="65.59"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2016">
                    <y valeur="109.12"/>
                    <vol valeur="0"/>
                </year>
                <year valeur="2017">
                    <y valeur="83.36"/>
                    <vol valeur="0"/>
                </year>
            </res>
        </lot>
        <lot id="756" esp="47" surf="20">
            <val1 valeur="600"/>
            <val2 valeur="600"/>
            <pval valeur="180"/>
            <res n="20">
                <year valeur="1998">
                    <y valeur="71.04"/>
                    <vol valeur="16200"/>
                </year>
                <year valeur="1999">
                    <y valeur="89.07"/>
                    <vol valeur="12000"/>
                </year>
                <year valeur="2000">
                    <y valeur="83.88"/>
                    <vol valeur="16200"/>
                </year>
                <year valeur="2001">
                    <y valeur="75.76"/>
                    <vol valeur="13200"/>
                </year>
                <year valeur="2002">
                    <y valeur="87.29"/>
                    <vol valeur="14400"/>
                </year>
                <year valeur="2003">
                    <y valeur="63.4"/>
                    <vol valeur="14400"/>
                </year>
                <year valeur="2004">
                    <y valeur="63.77"/>
                    <vol valeur="12000"/>
                </year>
                <year valeur="2005">
                    <y valeur="52.18"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2006">
                    <y valeur="78.48"/>
                    <vol valeur="9600"/>
                </year>
                <year valeur="2007">
                    <y valeur="88.58"/>
                    <vol valeur="13800"/>
                </year>
                <year valeur="2008">
                    <y valeur="83.42"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2009">
                    <y valeur="63.8"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2010">
                    <y valeur="76.76"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2011">
                    <y valeur="84.86"/>
                    <vol valeur="13800"/>
                </year>
                <year valeur="2012">
                    <y valeur="64.59"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2013">
                    <y valeur="67.49"/>
                    <vol valeur="16200"/>
                </year>
                <year valeur="2014">
                    <y valeur="88.59"/>
                    <vol valeur="12000"/>
                </year>
                <year valeur="2015">
                    <y valeur="51.52"/>
                    <vol valeur="12000"/>
                </year>
                <year valeur="2016">
                    <y valeur="65.2"/>
                    <vol valeur="16800"/>
                </year>
                <year valeur="2017">
                    <y valeur="74.5"/>
                    <vol valeur="14400"/>
                </year>
            </res>
        </lot>
    </batch>
</name>

我正在寻找一种将文件转换为数据框的简单方法,在该数据框上可以运行一些基本统计信息,例如箱线图,均值,总和等。

我没有将这些结果存储在任何类型的文件中,因为我想直接在R上运行整个过程(查询+结果+基本统计信息)。

您能帮我这个要求吗?

非常感谢

卡罗琳

1 个答案:

答案 0 :(得分:0)

我不知道您到底想要什么。下面的代码为数据帧中的每个批次提供yearyvol。您还需要其他东西吗?

library(xml2)
xml_as_list <- as_list(read_xml("xml02.xml"))

f <- function(LL){
  inner <- function(i){
    data.frame(year = attr(LL[[i]], "valeur"),
               y = attr(LL[[i]][["y"]], "valeur"),
               vol = attr(LL[[i]][["vol"]], "valeur"))
  }
  do.call(rbind, lapply(1:attributes(LL)[["n"]], inner))
}

dat <- do.call(rbind, 
               lapply(xml_as_list$name$batch[2:4], 
                      function(L) cbind(id = attributes(L)[["id"]], f(L[["res"]])))
)
rownames(dat) <- NULL

这给出了:

> dat
    id year      y   vol
1  754 1998  22.38     0
2  754 1999  27.78     0
3  754 2000  29.75     0
4  754 2001  25.03     0
5  754 2002  30.07     0
6  754 2003  23.57     0
7  754 2004  19.47     0
8  754 2005  18.63     0
9  754 2006  26.73     0
10 754 2007  31.64     0
11 754 2008  27.11     0
12 754 2009  20.14     0
13 754 2010  27.87     0
14 754 2011  27.92     0
15 754 2012  23.05     0
16 754 2013  24.96     0
17 754 2014  29.86     0
18 754 2015  16.93     0
19 754 2016  24.52     0
20 754 2017  25.55     0
21 755 1998  87.77     0
22 755 1999 109.08     0
23 755 2000 109.23     0
24 755 2001  94.07     0
25 755 2002  97.64     0
26 755 2003  73.26     0
27 755 2004  86.13     0
28 755 2005  80.59     0
29 755 2006  66.57     0
30 755 2007 103.99     0
31 755 2008 109.23     0
32 755 2009  96.62     0
33 755 2010  85.96     0
34 755 2011  49.51     0
35 755 2012 107.55     0
36 755 2013 109.23     0
37 755 2014  91.19     0
38 755 2015  65.59     0
39 755 2016 109.12     0
40 755 2017  83.36     0
41 756 1998  71.04 16200
42 756 1999  89.07 12000
43 756 2000  83.88 16200
44 756 2001  75.76 13200
45 756 2002  87.29 14400
46 756 2003   63.4 14400
47 756 2004  63.77 12000
48 756 2005  52.18 16800
49 756 2006  78.48  9600
50 756 2007  88.58 13800
51 756 2008  83.42 16800
52 756 2009   63.8 16800
53 756 2010  76.76 16800
54 756 2011  84.86 13800
55 756 2012  64.59 16800
56 756 2013  67.49 16200
57 756 2014  88.59 12000
58 756 2015  51.52 12000
59 756 2016   65.2 16800
60 756 2017   74.5 14400