我是新来的xml包和rpath的新手。我有一个非常大的XML文件,我解析。我使用循环编写了一些代码,但需要很长时间,所以我正在使用xpath编写更高效的代码。 的XML看起来是这样的:xpath和r - 创建一个密钥表
...
<person personId="1">
<personNames>
<personName nameId="1000">
<first>Joe<last>
<last>Jones<last>
</personName>
<personName nameId="1001">
<first>Joseph><first>
<last>Jones<last>
</personName>
<personName nameId="1002"
<first>The One and only Joe<first>
</personName>
</personNames>
</person>
...
有些人有一个名字,一些有更多。有些人有姓和名,有的只是名字或只是姓。所以,我需要小心。
我能够高效地创建使用XPath名字和姓氏的数据帧:
library(XML)
doc<-xmlTreeParse("People.xml",useInternalNodes = TRUE)
top<-xmlRoot(doc)
First<-as.character(xpathApply(top,"//person/personNames/personName/first", xmlValue))
name_id<-as.integer(xpathApply(top,"//person/personNames/personName[first]/@nameId"))
FirstNames<-data.frame(TMS_name_id=name_id,first=First)
Last<-as.character(xpathApply(top,"//person/personNames/personName/last", xmlValue))
name_id<-as.integer(xpathApply(top,"//person/personNames/personName[last]/@nameId"))
LastNames<-data.frame(name_id=name_id,last=Last)
Names<-merge(x=FirstNames,y=LastNames,by="name_id",all=TRUE)
我的姓名数据帧看起来不错。它有每个人的姓名,名字和姓氏。如果缺少名字或姓氏,则该名称为空。它在几分钟内产生(610K行!)。真棒。
问题在于将这些名称与父级personId关联。我假设我需要遍历数据框中的名称,并获取具有正确nameId属性的personId,但我无法执行此操作。例如,下面的代码给我一个空的结果:
xpathSApply(top,"//person/personNames/personName[@nameId="1000"]/@personId")
我期待的结果1。什么是在PERSONID我的数据帧添加一列的最有效方法是什么?
鉴于上面的例子,我想看起来像这样一个数据帧:
nameId first last personId
1000 Joe Jones 1
1001 Joseph Jones 1
1002 The one and only Joe <NA> 1
您能否包含您对样本输入数据的期望结果?我不确定你想要的输出的确切形式。 – MrFlick 2014-12-02 19:07:40
编辑。感谢您的时间。 – user2980491 2014-12-02 19:18:30