我需要将2000个XML文件中的数据读出到R中的一个数据帧中。到目前为止,我已使用xpath函数解决了该问题,因为我不需要文件中的所有信息。现在的问题是,不是每个文件都包含相同的节点,因此有时我需要获取文件的内容,并且当没有这样的节点时,我想要一个不适用的文件。
我的解决方案现在是(因为我是R的初学者,并且仅了解Basics)可以使用ifelse函数,这意味着我检查xpath长度的条件是否存在一个具有该名称的节点,以及是否存在第一,我想获取内容,否则,我想要NA。这有效,但是一旦我包含了3个以上的文件,最多只能包含3个文件。NA仍然可以正确放置,但是当存在一个具有该名称的节点时,内容的确会混淆,并且不会写在正确的IK旁边在表中
filenames<-list.files('~/R/', pattern = '.xml', full.names = TRUE)
IK <- unlist(lapply(filenames, function(f) {
xml <- xmlParse(f)
xpathSApply(xml, "//Qualitaetsbericht/Krankenhaus/Kontaktdaten/IK", xmlValue)
}))
QM_Tagungsfrequenz <- ifelse ((unlist(lapply(filenames, function(f) {
xml <- xmlParse(f)
length(xpathSApply(xml, "//Qualitaetsbericht/Umgang_mit_Risiken_in_der_Patientenversorgung/Lenkungsgremium_Qualitaetsmanagement/Lenkungsgremium/Tagungsfrequenz", xmlValue))
})))>=1 ,
unlist(lapply(filenames, function(f) {
xml <- xmlParse(f)
xpathSApply(xml, "//Qualitaetsbericht/Umgang_mit_Risiken_in_der_Patientenversorgung/Lenkungsgremium_Qualitaetsmanagement/Lenkungsgremium/Tagungsfrequenz", xmlValue)
}
)) , NA)
Test<-data.frame(IK,QM_Tagungsfrequenz)
数据
我正在使用的文件的示例(实际文件更大):
Example 1:
<Qualitaetsbericht>
<Krankenhaus>
<Kontaktdaten>
<IK>123456</IK>
</Kontaktdaten>
</Krankenhaus>
<Umgang_mit_Risiken_in_der_Patientenversorgung>
<Lenkungsgremium_Qualitaetsmanagement>
<Lenkungsgremium>
<Tagungsfrequenz>halbjährlich</Tagungsfrequenz>
</Lenkungsgremium>
</Lenkungsgremium_Qualitaetsmanagement>
</Umgang_mit_Risiken_in_der_Patientenversorgung>
</Qualitaetsbericht>
Example 2:
<Qualitaetsbericht>
<Krankenhaus>
<Kontaktdaten>
<IK>654321</IK>
</Kontaktdaten>
</Krankenhaus>
<Umgang_mit_Risiken_in_der_Patientenversorgung>
<Lenkungsgremium_Qualitaetsmanagement>
<Lenkungsgremium>
</Lenkungsgremium>
</Lenkungsgremium_Qualitaetsmanagement>
</Umgang_mit_Risiken_in_der_Patientenversorgung>
</Qualitaetsbericht>
输出
IK QM_Tagungsfrequenz
<chr> <chr>
1 123456 halbjährlich
2 654321 NA
问题
这是我希望为每个函数提供的确切输出,但是正如我提到的那样,当它们只有4个数据文件时,对于每个不是NA的列,“ QM_Tagungsfrequenz”将是错误的。