【问题标题】:plyr's ldply changes read_xml's behaviorplyr 的 ldply 改变了 read_xml 的行为
【发布时间】:2021-05-05 05:50:29
【问题描述】:

我试图从一堆 xml 文件中的每一个中读取几个字段。我写了一个小函数来提取我需要的字段并将它们作为向量返回:

id_dir <- function(d) {
  xml <- read_xml(d)
  id <- xml_text(xml_node(xml, 'AwardID'))
  dir <- xml_text(xml_node(xml, 'Abbreviation'))
  phone <- xml_text(xml_node(xml, 'PhoneNumber'))
  return(c(id, phone, dir))
}

但是当我用ldply 包装它时,会发生以下情况:

setwd('xmls/2017')
files <- list.files()[1:100]
sev_data <- plyr::ldply(files, id_dir)

Error in read_xml.character(d) : xmlParseEntityRef: no name [68]

尽管以下代码按预期工作,但仍会发生这种情况:

id_dir(glue('xmls/2017/{files[1]}'))

"1700003" "5746317432" "MPS"

我已经尝试过一段时间了,但大多数时候我看到人们在谈论 PHP 和很可能无关紧要的东西。

为了重现性,here 是我正在读取的文件的couple

【问题讨论】:

标签: r xml plyr


【解决方案1】:

您的功能按预期工作,可以通过您分享的示例进行验证。

id_dir('https://raw.githubusercontent.com/jdollman/stackoverflow/data/1700229.xml')
#[1] "1700229"    "8659743466" "MPS" 
      
id_dir('https://raw.githubusercontent.com/jdollman/stackoverflow/data/1715157.xml')
#[1] "1715157"    "5705773510" "BIO"       

所以问题是您如何将文件传递给函数id_dir。我不使用plyr,因为它早已退役并被dplyr 取代。我会在这里使用lapply

另一个问题可能是您的目录中有其他文件不是xml。您可以在list.files 中指定仅选择'xml' 文件。试试看:

setwd('xmls/2017')
files <- list.files(pattern = '\\.xml$')[1:100]
sev_data <- lapply(files, id_dir)

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 2021-02-25
    • 2020-11-30
    • 2016-02-16
    • 2015-08-16
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多