降价表到R中的数据帧

时间:2018-01-04 02:10:54

标签: r markdown r-markdown readr

有许多方法可以将数据帧转换为Markdown表。 但是在给定Markdown表的情况下,如何转换回数据帧

给出一个表格表格:

Table Header | Second Header
------------- | -------------
Table Cell | Cell 2
Cell 3 | Cell 4 

或者更糟糕的是,以一种形式

Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4 

如何将其纳入数据框?

2 个答案:

答案 0 :(得分:4)

我打了个问题,但后来意识到答案很简单。 read_delim包中的函数readr可以轻松处理:

library(readr)
library(dplyr)

object <- 'Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4'
data_frame <- read_delim(object, delim = '|')

# A tibble: 3 x 2
  `Table Header ` ` Second Header `
            <chr>             <chr>
1  -------------     ------------- 
2     Table Cell            Cell 2 
3         Cell 3             Cell 4

只需要过滤掉'-------'行。等瞧。

希望这个解决方案有助于某人。

答案 1 :(得分:2)

我写了几个函数来处理这些问题,但我怀疑这对于编写SO答案的人来说比其他人更成问题。无论:

# base R version
read.markdown <- function(file, stringsAsFactors = FALSE, strip.white = TRUE, ...){
    if (length(file) > 1) {
        lines <- file
    } else if (grepl('\n', file)) {
        con <- textConnection(file)
        lines <- readLines(con)
        close(con)
    } else {
        lines <- readLines(file)
    }
    lines <- lines[!grepl('^[[:blank:]+-=:_|]*$', lines)]
    lines <- gsub('(^\\s*?\\|)|(\\|\\s*?$)', '', lines)
    read.delim(text = paste(lines, collapse = '\n'), sep = '|', 
               stringsAsFactors = stringsAsFactors, strip.white = strip.white, ...)
}

# readr version
read_markdown <- function(file, trim_ws = TRUE, ...){
    if (length(file) > 1) {
        lines <- file
    } else {
        lines <- readr::read_lines(file)
    }
    lines <- lines[!grepl('^[[:blank:]+-=:_|]*$', lines)]
    lines <- gsub('(^\\s*?\\|)|(\\|\\s*?$)', '', lines)
    readr::read_delim(paste(lines, collapse = '\n'), delim = '|', 
                      trim_ws = trim_ws, ...)
}

他们可以处理许多降价表的变体,并且对单个字符串感到满意:

read.markdown('Table Header | Second Header \n------------- | ------------- \nTable Cell | Cell 2 \nCell 3 | Cell 4 ')
#>   Table.Header Second.Header
#> 1   Table Cell        Cell 2
#> 2       Cell 3        Cell 4

一个行向量(就像一个来自clipr::read_clip):

clipr::write_clip(
' |                     |  mpg  |  cyl  |  disp  |  hp  |
 |:-------------------:|:-----:|:-----:|:------:|:----:|
 |      Mazda RX4      |  21   |   6   |  160   | 110  |
 |    Mazda RX4 Wag    |  21   |   6   |  160   | 110  |
 |     Datsun 710      | 22.8  |   4   |  108   |  93  |'
)

read.markdown(clipr::read_clip())
#>               X  mpg cyl disp  hp
#> 1     Mazda RX4 21.0   6  160 110
#> 2 Mazda RX4 Wag 21.0   6  160 110
#> 3    Datsun 710 22.8   4  108  93

或文件名(尽管该文件只能包含表和空格):

tmp <- tempfile()
writeLines(
' +---------------------+-------+-------+--------+------+--------+
 |                     |  mpg  |  cyl  |  disp  |  hp  |  drat  |
 +=====================+=======+=======+========+======+========+
 |      Mazda RX4      |  21   |   6   |  160   | 110  |  3.9   |
 +---------------------+-------+-------+--------+------+--------+
 |    Mazda RX4 Wag    |  21   |   6   |  160   | 110  |  3.9   |
 +---------------------+-------+-------+--------+------+--------+
 |     Datsun 710      | 22.8  |   4   |  108   |  93  |  3.85  |
 +---------------------+-------+-------+--------+------+--------+',
tmp
)

read_markdown(tmp)
#> Warning: Missing column names filled in: 'X1' [1]
#> # A tibble: 3 x 6
#>   X1              mpg   cyl  disp    hp  drat
#>   <chr>         <dbl> <int> <int> <int> <dbl>
#> 1 Mazda RX4      21.0     6   160   110  3.90
#> 2 Mazda RX4 Wag  21.0     6   160   110  3.90
#> 3 Datsun 710     22.8     4   108    93  3.85

编辑:如果有人发现这些功能有用,我已将这些功能放在a package中。