【问题标题】:R Convert complex xml to dataframeR将复杂的xml转换为数据框
【发布时间】:2016-11-17 12:17:12
【问题描述】:

我正在将复杂的 XML 文件转换为数据框。

这种方法有两个问题:

  1. 两个都被复制到应该为空的地方
  2. 如果其中一个节点中有更多数据点,则有时会出现此错误:“参数暗示不同的行数:198、240”,它应该映射回同一行,如果它不存在,应该为空。
  3. 如何计算两个现有列等于 3?

这是它的简化版本:

require(xml2)

xml_data = "
<top>
    <line>
        <one>1</one>
    </line>
    <line>
        <one>1</one>
        <two>2</two>
    </line>
    <line>
        <one>1</one>
    </line>
</top>
"

data2 <- read_xml(file)


df <- data.frame(
  #purchase
  one=xml_text(xml_find_all(data2, ".//line/one")),
  two=xml_text(xml_find_all(data2, ".//line/two")),
  sum1 = one + two
)

【问题讨论】:

  • 您必须定位line,然后分别处理每个返回的节点。有关于如何执行此操作的示例。

标签: r xml dataframe xml-parsing


【解决方案1】:

写完评论后,我意识到实际的搜索工作不太可能:

require(xml2)
library(purrr)
library(dplyr)

xml_data = "
<top>
    <line>
        <one>1</one>
    </line>
    <line>
        <one>1</one>
        <two>2</two>
    </line>
    <line>
        <one>1</one>
    </line>
</top>
"

data2 <- read_xml(xml_data)

xml_find_all(data2, ".//line") %>% 
  map_df(function(x) {
    one <- xml_find_all(x, ".//one") %>% xml_text() %>% as.numeric()
    two <- xml_find_all(x, ".//two") %>% xml_text() %>% as.numeric()
    if (length(two) == 0) two <- NA_integer_
    data_frame(one, two, sum=sum(one, two, na.rm=TRUE))
  })
## # A tibble: 3 × 3
##     one   two   sum
##   <dbl> <dbl> <dbl>
## 1     1    NA     1
## 2     1     2     3
## 3     1    NA     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多