我正在尝试从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?
答案 0 :(得分:0)
这里有一些想法......
这会找到所有XColumn
和YColumn
个节点:
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
进行转换,而且我并不完全确定您希望如何合并XColumn
和YColumn
给出的值{&#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时注意到了几件事:
Prism允许用户具有子列,但它们可能具有不同的含义,这被指定为表的YFormat
属性。例如,replicates
表示子列是重复项,而SDN
表示子列是均值,标准差和观察次数。 pzfx
包尝试通过查看YFormat
来推断子列类型,并将适当的后缀附加到列名上。
Prism允许用户从表中删除某些单元格。这由子列的Excluded
属性指定。阅读表格时,需要决定如何处理这些排除的值。 pzfx
包允许用户保留,排除或保留prsim文件中的“ *”(这使所有列的类型为character
)。
希望如果有人需要做类似的事情,这会很有用。欢迎在github上发布问题报告。