R从Graphpad Prism导入XML

时间:2014-08-26 12:41:43

标签: xml r

我正在尝试从Graphpad Prism .pzfx文件导入原始数据,原则上是.xml文件。我拿出了大部分棱镜特定的东西,只留下了我感兴趣的部分。:

<?xml version="1.0" encoding="UTF-8"?>
<GraphPadPrismFile xmlns="http://graphpad.com/prism/Prism.htm" PrismXMLVersion="5.00">
  <TableSequence Selected="1">
    <Ref ID="Table0" Selected="1"/>
  </TableSequence>
  <Table ID="Table0" XFormat="error" YFormat="replicates" Replicates="1" TableType="XY" EVFormat="AsteriskAfterNumber">
    <Title>Data 1</Title>
    <XColumn Width="162" Decimals="0" Subcolumns="1">
      <Title>X</Title>
      <Subcolumn>
        <d>1</d>
        <d>2</d>
        <d>3</d>
        <d>4</d>
        <d>5</d>
      </Subcolumn>
    </XColumn>
    <YColumn Width="81" Decimals="4" Subcolumns="1">
      <Title>ML</Title>
      <Subcolumn>
        <d>120</d>
        <d>100</d>
        <d>5</d>
        <d>0</d>
        <d>1.5</d>
      </Subcolumn>
    </YColumn>
    <YColumn Width="81" Decimals="4" Subcolumns="1">
      <Title>MH</Title>
      <Subcolumn>
        <d>10</d>
        <d>560</d>
        <d>665</d>
        <d>40</d>
        <d>31.5</d>
      </Subcolumn>
    </YColumn>
    <YColumn Width="81" Decimals="6" Subcolumns="1">
      <Title>MH2</Title>
      <Subcolumn>
        <d>1.20</d>
        <d>100</d>
        <d>5</d>
        <d>0</d>
        <d>1.5</d>
      </Subcolumn>
    </YColumn>
    <YColumn Width="81" Decimals="6" Subcolumns="1">
      <Title>MH1</Title>
      <Subcolumn>
        <d>120</d>
        <d>100</d>
        <d>5</d>
        <d>0</d>
        <d>1.5</d>
      </Subcolumn>
    </YColumn>
  </Table>
</GraphPadPrismFile>

根据我的理解,我有一个Node Table,它还有XColumn,YColumn节点,它们有Title,然后有Subcolumn节点。那些包含我想要转换成R-data.frame的原始数据。

到目前为止,我已设法导入一个YColumn :(文件是上面一个的路径)

xData <- xmlParse(file)
xData.rt <- xmlRoot(xData)
xmlToDataFrame(xData.rt[["Table"]][["YColumn"]][["Subcolumn"]])

这给了我第一个YColumn作为data.frame:

  text
1  120
2  100
3    5
4    0
5  1.5

是否有(或许也更简单?)方式将所有X和Y Colums导入一个data.frame?

2 个答案:

答案 0 :(得分:0)

这里有一些想法......

这会找到所有XColumnYColumn个节点:

columns = xpathSApply(xData,"//ns:XColumn|//ns:YColumn",
             namespaces=c(ns="http://graphpad.com/prism/Prism.htm"))

然后,给定其中一个,这得到标题和值:

> xpathSApply(columns[[2]],".//ns:Title",
    namespaces=c(ns="http://graphpad.com/prism/Prism.htm"),xmlValue)
[1] "ML"
> xpathSApply(columns[[2]],".//ns:d",
    namespaces=c(ns="http://graphpad.com/prism/Prism.htm"),xmlValue)
[1] "120" "100" "5"   "0"   "1.5"

您可以通过查看XColumn来判断某些内容是YColumn还是xmlName

> xmlName(columns[[1]])
[1] "XColumn"
> xmlName(columns[[2]])
[1] "YColumn"

这可能足够的建筑工具包件。循环遍历columns并使用cbind向上堆叠值......

显然,基于字符的数字需要使用as.numeric进行转换,而且我并不完全确定您希望如何合并XColumnYColumn给出的值{&#39}。少了XColumn个值......

答案 1 :(得分:-1)

更新:该库也在CRAN上,可以通过以下方式安装:

install.packages("pzfx")

tl; dr:研究了pzfx文件的XML结构之后,我编写了一个程序包here和一个博客帖子here。简短地,

devtools::install_github("Yue-Jiang/pzfx")
library(pzfx)
pzfx_tables("/path/to/my/pzfx/file") # list tables in a .pzfx file
df <- read_pzfx("/path/to/my/pzfx/file", 1) # read first table
df <- read_pzfx("/path/to/my/pzfx/file", "Table Name") # read table by name

我在尝试解析prsim XML时注意到了几件事:

  1. Prism允许用户具有子列,但它们可能具有不同的含义,这被指定为表的YFormat属性。例如,replicates表示子列是重复项,而SDN表示子列是均值,标准差和观察次数。 pzfx包尝试通过查看YFormat来推断子列类型,并将适当的后缀附加到列名上。

  2. Prism允许用户从表中删除某些单元格。这由子列的Excluded属性指定。阅读表格时,需要决定如何处理这些排除的值。 pzfx包允许用户保留,排除或保留prsim文件中的“ *”(这使所有列的类型为character)。

希望如果有人需要做类似的事情,这会很有用。欢迎在github上发布问题报告。