【问题标题】:Converting XML to dataframe when values are missing缺少值时将 XML 转换为数据框
【发布时间】:2018-11-04 04:44:40
【问题描述】:

我在这篇文章 (R dataframe from XML when values are multiple or missing ) 中读到了类似的问题,但 XML 文件的格式与我所拥有的不同。我的 XML 是这样的:

<?xml version="1.0" encoding="utf-8"?>
<users>
  <row 
     Id="-1" 
     Body="Hello! I am a programmer!" 
     OwnerUserId="11111" 
  />
<\users>

首先,这是正确的 XML 还是不同的类型?

第二,我已经尝试了该帖子中的所有答案,但没有一个适用于这种 XML 格式。

第三,在这种情况下,如果某些行没有例如OwnerUserId,我怎样才能有效地解析这些行?

我已经编写了以下代码来执行此操作,我想知道是否有一种有效且更快的方法来执行此操作,而不是逐行读取?

    posts <- xmlParse('path_to_file.xml')
    xml_posts <- xmlToList(posts)

    df_posts <- as.data.frame(matrix(ncol = 3))
    df_posts <- df_posts[-1,]
    colnames(df_posts) <- c(
        "Id"
      , "Text"
      , "User_ID"
                     )

    for(i in 1:length(xml_posts)){
        user_id <- 'none'
        xml_unlisted <- unlist(xml_posts[i])
        name <- names(xml_unlisted)

        if (length(xml_unlisted[name == "row.OwnerUserId"]) != 0){
            user_id <- xml_unlisted[name == "row.OwnerUserId"] 
        }

        df_temp <-  data.frame(list(
           xml_unlisted[name == "row.Id"]
          ,xml_unlisted[name == "row.Body"]
          ,user_id
            ))

        colnames(df_temp) <- c(
            "Id"
          , "Text"
          , "User_ID"
          )


        df_posts <- rbind(df_posts, df_temp)
    }

    head(df_posts)

【问题讨论】:

    标签: r xml dataframe missing-data


    【解决方案1】:

    为了解析 xml,我现在将使用 xml2。假设您的 xml 是多个用户的这种形式,如果属性是 xml 中存在的节点,我会这样做并获得 NA

    xml_string <- '<?xml version="1.0" encoding="utf-8"?>
    <users>
      <row 
         Id="1" 
         Body="Hello! I am a programmer!" 
         OwnerUserId="11111" 
      />
      <row 
         Id="2" 
         Body="Hello! I am a teacher!" 
      />
    </users>'
    library(xml2)
    # for the pipe
    library(magrittr)
    # get the row nodes
    xml <- read_xml(xml_string) %>% xml_find_all("row")
    data.frame(
      Id = xml %>% xml_attr("Id"),
      Text = xml %>% xml_attr("Body"),
      User_ID = xml %>% xml_attr("OwnerUserId")
    )
    #>   Id                      Text User_ID
    #> 1  1 Hello! I am a programmer!   11111
    #> 2  2    Hello! I am a teacher!    <NA>
    

    reprex package (v0.2.1) 于 2018 年 11 月 4 日创建

    【讨论】:

    • 非常感谢! :) 这个库效率更高,节省了大量时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2022-01-20
    • 2021-03-25
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多