【问题标题】:writing and reading class of columns to csv将列类写入和读取到 csv
【发布时间】:2022-01-05 11:48:14
【问题描述】:

对于数据框,我想将每列的数据类(例如 char、double、factor)保存到 csv,然后能够将数据和类读回 R。

例如,我的数据可能如下所示:

df
#> # A tibble: 3 × 3
#>    item  cost blue 
#>   <int> <int> <fct>
#> 1     1     4 1    
#> 2     2    10 1    
#> 3     3     3 0

(此处输入数据的代码:)

library(tidyverse)
df <- tibble::tribble(
  ~item, ~cost, ~blue,
     1L,    4L,    1L,
     2L,   10L,    1L,
     3L,    3L,    0L
  )

df <- df %>% 
  mutate(blue = as.factor(blue))
df

我可以通过这种方式保存数据的类和数据:

library(tidyverse)
classes <- map_df(df, class)

write_csv(classes, "classes.csv")
write_csv(df, "data.csv")

我可以这样读:

classes <- read.csv("classes.csv") %>% 
  slice(1) %>% 
  unlist()
classes
df2 <- read_csv("data.csv", col_types = classes)
df2

有没有更快的方法来完成这一切?

尤其是我保存 classes 然后读回它,然后切片和取消列出的方式?

【问题讨论】:

    标签: r dplyr tidyverse readr


    【解决方案1】:

    您可以使用writeLines 及其对应的readLines 来进行类。像这样:

    classes <- sapply(df, class)
    writeLines(classes, "classes.txt")
    #to read them
    readLines("classes.txt")
    

    但是,也可以考虑其他格式,例如 parquet(R 实现由 arrow 包提供),例如保留数据类型并由多种语言实现。

    【讨论】:

      【解决方案2】:

      试试 csvy 包。另请参阅http://csvy.org/ 网站。这会生成一个文件而不是两个文件,从而简化了使用它(或者可以选择将元数据写入单独的文件),还有一些其他语言的 csvy 阅读器(参见刚刚引用的链接),格式是标准化的,并且向后兼容 csv,这可能比滚动您自己的格式更好。

      library(csvy)
      write_csvy(df, "df.csvy")
      

      这会产生这个文件:

      #---
      #profile: tabular-data-package
      #name: df
      #fields:
      #- name: item
      #  type: integer
      #- name: cost
      #  type: integer
      #- name: blue
      #  type: integer
      #--- 
      item,cost,blue
      1,4,1
      2,10,1
      3,3,0
      

      可以在使用中读回:

      read_csvy("df.csvy")
      

      read.csv("df.csvy", comment.char = "#") 或任意数量的具有读取 csv 文件功能的 R 包。

      我们可以使用以下方法将元数据提取为列表:

      library(yaml)
      md <- get_yaml_header("df.csvy")
      md_list <- yaml.load(paste(md, collapse = "\n"))
      
      str(md_list)
      ## List of 3
      ##  $ profile: chr "tabular-data-package"
      ##  $ name   : chr "df"
      ##  $ fields :List of 3
      ##   ..$ :List of 2
      ##   .. ..$ name: chr "item"
      ##   .. ..$ type: chr "integer"
      ##   ..$ :List of 2
      ##   .. ..$ name: chr "cost"
      ##   .. ..$ type: chr "integer"
      ##   ..$ :List of 2
      ##   .. ..$ name: chr "blue"
      ##   .. ..$ type: chr "integer"
      

      添加

      data.table 包中带有参数 yaml=TRUE 的 fwrite 可用于在 yaml 标头中写入内容略有不同的 csvy 文件。 rio包的导出功能也可以使用fwrite生成csvy文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 2019-10-05
        • 2013-10-04
        • 2017-10-16
        • 1970-01-01
        相关资源
        最近更新 更多