我正在尝试使用xml包和xmltolist或xmltodataframe函数。
我的输入数据在Internet上(前两行),我只需要处理XML的某些部分(请参阅第三个nodeset命令)
url<- 'http://ClinicalTrials.gov/show/NCT00191100?resultsxml=true'
xml = xmlTreeParse(url,useInternalNode=TRUE)
ns <- getNodeSet(xml, '/clinical_study/clinical_results/reported_events/serious_events/category_list')
它是一个类别列表,内部类别是“事件”。事件有计数(计数是针对临床试验组的(例如,药物组和安慰剂组)
我只需要事件,所以最好的列表是这里使用xmltolist的cario呼吸停止
xl<-xmlToList(url)
set2<-xl$clinical_results$reported_events$serious_events$category_list
set2[[3]]
> set2[[3]]
$title
[1] "Cardiac disorders"
$event_list
$event_list$event
$event_list$event$sub_title
[1] "Cardio-respiratory arrest"
$event_list$event$counts
group_id events subjects_affected subjects_at_risk
"E1" "1" "1" "260"
$event_list$event$counts
group_id events subjects_affected subjects_at_risk
"E2" "0" "0" "255"
由于此错误,我无法使用xmltodataframe。(nodeset2在xmltattributes中包含所有数据,我认为xmltodataframe可能不喜欢这样)
hopefulyDF <- getNodeSet(xml, '/clinical_study/clinical_results/reported_events/serious_events/category_list/category/event_list/event/counts')
xmlToDataFrame(node = hopefulyDF)
Error in matrix(vals, length(nfields), byrow = TRUE) :
'data' must be of a vector type, was 'NULL'
如何最好地提取计数数据?我试过单列,但可能我的R不够高。我想避免循环和手动xmlgetattr。但在最坏的情况下,任何解决方案都是可以接受的。我发现XML包非常密集,有两个版本的XML数据作为列表和节点集…:
理想的输出如下:(所有事件(不仅仅是第3行)
event group_ID numerator denumerator
Cardio-respiratory arrest E1 1 260
Cardio-respiratory arrest E2 0 250
(或者甚至有一个分类栏(心脏病)-那将是非常理想的)
附笔
我用了这个问题How to transform XML data into a data.frame?
这个问题很难回答。:
最佳答案
通过遍历每个event
并通过相对的xpath提取counts
属性,可以简化xml提取。通过使用rbindlist
包中的data.table
,您可以在不添加条件代码的情况下处理丢失的属性:
library(XML)
library(data.table)
url <- 'http://ClinicalTrials.gov/show/NCT00191100?resultsxml=true'
xml <- xmlTreeParse(url,useInternalNode=TRUE)
ns <- getNodeSet(xml, '//event')
rbindlist(lapply(ns, function(x) {
event <- xmlValue(x)
data.frame(event, t(xpathSApply(x, ".//counts", xmlAttrs)))
}), fill=TRUE)
## event group_id subjects_affected events subjects_at_risk
## 1: Total, serious adverse events E1 44 NA NA
## 2: Total, serious adverse events E2 17 NA NA
## 3: Anaemia E1 6 6 260
## 4: Anaemia E2 0 0 255
## 5: Febrile neutropenia E1 6 6 260
## ---
## 174: Cough E2 15 16 255
## 175: Pruritus E1 14 16 260
## 176: Pruritus E2 9 9 255
## 177: Hypertension E1 19 19 260
## 178: Hypertension E2 21 21 255
如果需要,您始终可以将其转换回
data.frame
和/或重命名列。