From 3c9cb593671ec83aae7169b859e20e4ceea3cc7a Mon Sep 17 00:00:00 2001 From: Hope <32947502+hope-data-science@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:24:36 +0800 Subject: [PATCH] Add files via upload --- ...\346\211\271\345\244\204\347\220\206.html" | 81 ++++++++++++++----- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git "a/docs/\345\214\226\346\225\264\344\270\272\351\233\266\357\274\232\345\257\271\346\226\207\344\273\266\350\277\233\350\241\214\346\211\271\345\244\204\347\220\206.html" "b/docs/\345\214\226\346\225\264\344\270\272\351\233\266\357\274\232\345\257\271\346\226\207\344\273\266\350\277\233\350\241\214\346\211\271\345\244\204\347\220\206.html" index c5af9d0..280eea2 100644 --- "a/docs/\345\214\226\346\225\264\344\270\272\351\233\266\357\274\232\345\257\271\346\226\207\344\273\266\350\277\233\350\241\214\346\211\271\345\244\204\347\220\206.html" +++ "b/docs/\345\214\226\346\225\264\344\270\272\351\233\266\357\274\232\345\257\271\346\226\207\344\273\266\350\277\233\350\241\214\346\211\271\345\244\204\347\220\206.html" @@ -247,10 +247,11 @@

目录

  • 8.5 小结
  • 8.6 练习
  • @@ -338,11 +339,11 @@

    -
    nr_of_rows <- 1e7
    +
    nr_of_rows <- 1e7 # 可适当增加数据量,如改为 5e7或1e8
     
     df <- data.table(
         Logical = sample(c(TRUE, FALSE, NA), prob = c(0.85, 0.1, 0.05), nr_of_rows, replace = TRUE),
    -    Integer = sample(1L:100L, nr_of_rows, replace = TRUE),
    +    Integer = sample(1L:100L, nr_of_rows, replace = TRUE), # 可适当增加文件数量,如改为 1:1e3或1:1e4
         Real = sample(sample(1:10000, 20) / 100, nr_of_rows, replace = TRUE),
         Factor = as.factor(sample(labels(UScitiesD), nr_of_rows, replace = TRUE))
       )
    @@ -400,40 +401,76 @@ 

    })

    -
    -

    8.4.3 文件的压缩

    +
    +

    8.4.3 文件批量读取

    +

    如果我们需要对csv文件夹下的所有文件进行读取,然后合并为一个数据框,可以使用readr包的read_csv函数进行实现,操作方法如下:

    +
    +
    dir_ls("temp/csv") -> all_csv_paths
    +read_csv(all_csv_paths,id = "file_path") -> all_data
    +all_data
    +
    +# # A tibble: 10,000,000 × 5
    +#    file_path      Logical Integer  Real Factor      
    +#    <chr>          <lgl>     <dbl> <dbl> <chr>       
    +#  1 temp/csv/1.csv TRUE          1 54.6  Denver      
    +#  2 temp/csv/1.csv TRUE          1 52.2  Houston     
    +#  3 temp/csv/1.csv TRUE          1 35.8  SanFrancisco
    +#  4 temp/csv/1.csv TRUE          1 79.5  Houston     
    +#  5 temp/csv/1.csv TRUE          1 92.2  LosAngeles  
    +#  6 temp/csv/1.csv FALSE         1 53.8  Atlanta     
    +#  7 temp/csv/1.csv TRUE          1 78.4  Miami       
    +#  8 temp/csv/1.csv TRUE          1 18.2  Atlanta     
    +#  9 temp/csv/1.csv TRUE          1  8.83 Denver      
    +# 10 temp/csv/1.csv FALSE         1 49.8  Houston     
    +# # ℹ 9,999,990 more rows
    +# # ℹ Use `print(n = ...)` to see more rows
    +
    +

    那么在返回的all_data变量中,包含了所有文件合并后的信息,其中file_path列保存了文件的路径。

    +

    不过在R中,能够最快读取csv格式文件的还是data.table包提供的fread函数,因此如果对性能有较高要求,可以这样操作:

    +
    +
    map_dfr(all_csv_paths,fread) -> all_data2
    +
    +

    这里使用了purrr包的map_dfr函数,会开展向量化操作,得到的结果会把数据框按照行合并到一起。在上述操作中,没有记录文件名称,如果需要记录,可以这样操作:

    +
    +
    lapply(all_csv_paths,\(x) fread(x)[,file_path:=x]) %>% 
    +  rbindlist() -> all_data3
    +
    +

    这里我们使用了基本包的lapply函数,并且利用data.table包的rbindlist函数把获得的数据框列表合并到一起。

    +
    +
    +

    8.4.4 文件的压缩

    在本部分中,我们会对先前生成的数据进行打包压缩。由于Excel文件已经是一整个文件,因此不需要再进行压缩操作。我们首先把csv文件都打包为zip文件:

    -
    archive_write_dir(archive = "temp/csv.zip",dir = "temp/csv")
    +
    archive_write_dir(archive = "temp/csv.zip",dir = "temp/csv")

    另一方面,我们把fst文件都打包为tar文件:

    -
    archive_write_dir(archive = "temp/fst.tar",dir = "temp/fst")
    +
    archive_write_dir(archive = "temp/fst.tar",dir = "temp/fst")
    -
    -

    8.4.4 文件的移动

    +
    +

    8.4.5 文件的移动

    我们知道,文件打包后,移动会更加快。我们不妨来进行尝试,在temp中再建立一个dest文件夹,然后分别把csv文件夹和csv压缩包移动进去,并测试移动时间:

    -
    dir_create("temp/dest")
    -pst(file_move("temp/csv","temp/dest/csv"))
    -pst(file_move("temp/csv.zip","temp/dest/csv.zip"))
    +
    dir_create("temp/dest")
    +pst(file_move("temp/csv","temp/dest/csv"))
    +pst(file_move("temp/csv.zip","temp/dest/csv.zip"))

    如果效果不明显,可以尝试增加文件数量。

    -
    -

    8.4.5 保存为Excel文件

    +
    +

    8.4.6 保存为Excel文件

    在这一步中,我们会把fst中的1到3号文件转存在一个Excel文件中(命名为“1-3.xlsx”),分成不同的工作簿进行保存,实现方法如下:

    -
    map(path("temp","fst",1:3,ext = "fst"),import_fst) %>% 
    -  write_xlsx(path("temp","1-3",ext = "xlsx"))
    +
    map(path("temp","fst",1:3,ext = "fst"),import_fst) %>% 
    +  write_xlsx(path("temp","1-3",ext = "xlsx"))
    -
    -

    8.4.6 文件的删除

    +
    +

    8.4.7 文件的删除

    下面我们尝试删除temp文件夹,操作方法如下:

    -
    file_delete("temp")
    +
    file_delete("temp")