【问题标题】:Creating a data frame from poorly stored list data (Removing the first row which is junk)从存储不良的列表数据创建数据框(删除第一行是垃圾)
【发布时间】:2019-08-22 02:04:06
【问题描述】:

我们的教授不断给我们分配在 R 中工作的任务,但我们通常不得不从网络上获取更简单的数据,而不是给我们提供更简单的数据。

这段代码就是这样做的:

library(rvest)
url <- "https://www.supremecourt.gov/opinions/slipopinion/18"
page <- read_html(url)
table <- html_table(page, fill = FALSE, trim = TRUE)

但是这也包含在表数据中:

表 [[1]] X1 1 搜索提示\r\n 搜索 术语太短 \r\n 无效 搜索词中的文本。再试一次 X2 1 高级搜索文档搜索

所以我很难理解如何将这些数据格式化为数据框,因为像as.data.frame(table) 这样的操作会给我这个错误,

错误(函数(...,row.names = NULL,check.rows = FALSE, check.names = TRUE,:参数暗示不同的行数:1, 11、8、7、2

【问题讨论】:

  • 你的教授帮了你一个忙,现实世界的数据很混乱 :) 假设你想要每个月的表格,最好使用 html_nodes("table") 和选择器获取表格所需的表,在使用 html_table 之前。

标签: r list


【解决方案1】:

您可以使用选择器将包含数据的表格与页面上的其他表格(例如搜索框)区分开来。在这种情况下,数据表属于 table-bordered 类:

page %>% 
  html_nodes("table.table-bordered") %>% 
  html_table()

【讨论】:

    【解决方案2】:

    我认为我们可以通过两种方式来处理它。如果确定只出现第一类错误,可以通过grepl搜索Search term too short,排除table列表中的任意元素,再执行bind_rows

    library(dplyr)
    table[unlist(lapply(
      table, 
      function(x) sum(grepl("Search term too short", x))
    )) < 1] %>% 
      bind_rows()
    

    否则,由于列表的其他“不错”元素具有相同的列名/格式,您也可以使用它。

    table[unlist(lapply(
      table, 
      function(x) sum(grepl("Docket", names(x))) > 0
    ))] %>% 
      bind_rows()
    

    【讨论】:

    • 非常感谢!这就是我理解 unlist 和 bindrows 的诀窍,但 function(x) sum ... 东西对我来说没有意义,但我猜它过滤数据以从表中选择?
    • @BaileyMiller sum 存在是因为 grepl 在多个元素上运行。你可以尝试一一分解,看看它们在做什么!
    猜你喜欢
    • 2018-03-15
    • 2014-09-12
    • 2013-05-18
    • 2021-11-30
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多