【问题标题】:working directory error when read multiple xml files in R and combine the data在 R 中读取多个 xml 文件并合并数据时出现工作目录错误
【发布时间】:2020-05-03 16:14:32
【问题描述】:

我正在尝试从我当前的数据中解析/读取多个 xml 文件并尝试将它们组合在一起。

而我的示例 xml 文件是这样的:

<ApplicationResponse>
    <Service Name="AlternativeCreditAttributes">
      <Categories>
        <Category Name="Default">
          <Attributes>
            <Attribute Name="ACA_ACH_NSF_12M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_18M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_24M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_3M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_6M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_9M" Value="0" />
            <Attribute Name="ACA_ACH_NSF_AMT_12M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_18M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_24M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_3M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_6M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_9M" Value="" />
            <Attribute Name="ACA_ACH_NSF_AMT_EVER" Value="600" />
            <Attribute Name="ACA_ACH_NSF_EVER" Value="2" />
            <Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_NEWEST" Value="41" />
            <Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_OLDEST" Value="41" />
          </Attributes>
        </Category>
      </Categories>
    </Service>
</ApplicationResponse>

我已经根据以下代码成功拉取了一个文件:

doc<-read_xml(Data$XMLResponse[1])
  # setNames(data.frame(
    cols<- xml_attr(xml_find_all(doc, "//Attribute"), "Name")
    rows<- xml_attr(xml_find_all(doc, "//Attribute"), "Value")
  # ),
out  <- data.frame(rows, row.names = cols)
out

但是当我尝试使用lapply 来基于这个answer 提取多个文件时,我遇到了工作目录上的错误。

错误:当前工作目录中不存在“NA”

以下是我使用的代码。如果您知道该问题或需要有关此问题的任何详细信息,请告诉我。提前致谢。

df_list <- lapply(Data$XMLResponse, function(f) {
  doc <- read_xml(f)
  setNames(data.frame(
    xml_attr(xml_find_all(doc, "//Attribute"), "Name"),
    xml_attr(xml_find_all(doc, "//Attribute"), "Value")
  ),c("Name", f))
})

【问题讨论】:

  • 如果您在使用 lapply 时遇到问题,您可以通过查看为什么尝试将相同的代码作为循环运行的原因来更轻松地解决问题。首先创建一个空列表,将 doc 变量存储在列表的每个索引处,然后如果循环抛出错误,请检查新列表的大小。通常,您会发现您正在处理的向量的元素之一会产生意想不到的结果。
  • 谢谢@AllanCameron。创建一个空列表帮助我找到循环停止的位置。这可能是因为文件中的非法xml字符。

标签: r xml lapply working-directory


【解决方案1】:

这是一种方法,它使用for() 循环从您存储在 Data$XMLResponse 中的每个 xml 文件中收集所有值。代码假定每个 xml 文件在相同的顺序中具有完全相同长度的“属性”。

library(xml2)    
#create a blank list
datalist = list()
#loop through your column of xml responses to extract the values you want.
for(i in 1:length(Data$XMLResponse)){
temp_vals<-read_xml(Data$XMLResponse[i])
temp_vals<-xml_attr(xml_find_all(temp_vals, "//Attribute"), "Value")
#assign these values to your data list
datalist[[i]]<-temp_vals
}

#bind the data from the xml files together
your_data = do.call(rbind, datalist)

然后获取列名:

your_column_names<-xml_attr(xml_find_all(Data$XMLResponse[1], "//Attribute"), "Name")
doc<-setNames(data.frame(matrix(ncol = length(your_column_names), nrow = 0)), your_column_names)

然后使用rbind() 将您的数据与您的列名绑定

rbind(doc,your_data)

【讨论】:

  • 谢谢@SEAnalyst。我想知道你如何定义temp_xmp。我将代码temp_xmp&lt;-read_xml(Data$XMLResponse[i]) 放入您的for 循环中,然后再次出现相同的工作目录错误。
  • 我已经纠正了错误(删除了temp_xmp的对象)并添加了一行temp_vals&lt;-read_xml(Data$XMLResponse[i])
猜你喜欢
  • 2018-08-18
  • 2017-07-11
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
相关资源
最近更新 更多