Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将XML的一部分转换为数据帧?(适当地)_Xml_R - Fatal编程技术网

如何将XML的一部分转换为数据帧?(适当地)

如何将XML的一部分转换为数据帧?(适当地),xml,r,Xml,R,我试图从ClinicalTrials.gov的XML文件中提取信息。文件的组织方式如下: <clinical_study> ... <brief_title> ... <location> <facility> <name> <address> <city> <state> <zip>

我试图从ClinicalTrials.gov的XML文件中提取信息。文件的组织方式如下:

<clinical_study>
  ...
  <brief_title>
  ...
  <location>
    <facility>
      <name>
      <address>
        <city>
        <state>
        <zip>
        <country>
    </facility>
    <status>
    <contact>
      <last_name>
      <phone>
      <email>
    </contact>
  </location>
  <location>
    ...
  </location>
  ...
</clinical_study>

...
...
...
...
我可以在以下代码中使用CRAN的R XML包从XML文件中提取所有位置节点:

library(XML)
clinicalTrialUrl <- "http://clinicaltrials.gov/ct2/show/NCT01480479?resultsxml=true"
xmlDoc <- xmlParse(clinicalTrialUrl, useInternalNode=TRUE)
locations <- xmlToDataFrame(getNodeSet(xmlDoc,"//location"))
库(XML)

clinicalTrialUrl您可以先展平XML

flatten_xml <- function(x) {
  if (length(xmlChildren(x)) == 0) structure(list(xmlValue(x)), .Names = xmlName(xmlParent(x)))
  else Reduce(append, lapply(xmlChildren(x), flatten_xml))
}

dfs <- lapply(getNodeSet(xmlDoc,"//location"), function(x) data.frame(flatten_xml(x)))
allnames <- unique(c(lapply(dfs, colnames), recursive = TRUE))
df <- do.call(rbind, lapply(dfs, function(df) { df[, setdiff(allnames,colnames(df))] <- NA; df }))
head(df)

 #          city      state   zip       country     status          last_name        phone                    email               last_name.1
 # 1  Birmingham    Alabama 35294 United States Recruiting Louis B Nabors, MD 205-934-1813          bnabors@uab.edu        Louis B Nabors, MD
 # 2      Mobile    Alabama 36604 United States Recruiting Melanie Alford, RN 251-445-9649     malford@usouthal.edu    Pamela Francisco, CCRP
 # 3     Phoenix    Arizona 85013 United States Recruiting     Lynn Ashby, MD 602-406-6262           LASHBY@CHW.EDU            Lynn Ashby, MD
 # 4      Tucson    Arizona 85724 United States Recruiting         Jamie Holt 520-626-6800 jholt1@email.arizona.edu Baldassarre Stea, MD, PhD
 # 5 Little Rock   Arkansas 72205 United States Recruiting   Wilma Brooks, RN 501-686-8530       ALEubanks@uams.edu       Amanda Eubanks, APN
 # 6    Berkeley California 94704 United States  Withdrawn               <NA>         <NA>                     <NA>                      <NA>

flatte\u xml此答案将xml转换为列表,取消列出每个位置节,转换节,将节转换为
data.table
,然后使用
rbindlist
将所有单个位置合并为一个表。
fill=T
参数按名称匹配元素,并用
NA
填充缺少的元素值

library(XML); library(data.table)

clinicalTrialUrl <- "http://clinicaltrials.gov/ct2/show/NCT01480479?resultsxml=true"
xmlDoc <- xmlParse(clinicalTrialUrl, useInternalNode=TRUE)

xmlToDT <- function(doc, path) {
  rbindlist(
    lapply(getNodeSet(doc, path),
           function(x) data.table(t(unlist(xmlToList(x))))
    ), fill=T)
}

locationDT <- xmlToDT(xmlDoc, "//location")
locationDT[1:6]
##                                                                       facility.name facility.address.city facility.address.state facility.address.zip
## 1:                                                                "HYGEIA" Hospital               Marousi     District of Attica               151 23
## 2: Allina Health, Abbott Northwestern Hospital, John Nasseff Neuroscience Institute           Minneapolis              Minnesota                55407
## 3:                  Amrita Institute of Medical Sciences and Research Centre, Kochi                 Kochi                 Kerala              682 026
## 4:                                                      Anne Arundel Medical Center             Annapolis               Maryland                21401
## 5:                                                              Atlanta Cancer Care               Atlanta                Georgia                30005
## 6:                                                                    Austin Health            Heidelberg               Victoria                 3084
##    facility.address.country
## 1:                   Greece
## 2:            United States
## 3:                    India
## 4:            United States
## 5:            United States
## 6:                Australia
库(XML);库(数据表)

clinicalTrialUrl您可以这样做:
xpathsaply(xmlDoc,//clinical\u-study/location/facility/name”,xmlValue)
的每个成分分别吸出来。但我不知道如何一下子做到。你所做的对我来说非常有效。我的XML文件很简单。谢谢,它成功了。出于某种原因,我的编译器不喜欢函数的语法,所以我不得不将它改为:
flatte\uxml是的,我想我们使用的是不同的版本。修正。有机会的时候别忘了接受我的回答。:)