我有多个csv文件在我的文件夹以下sintax:"销售产生绯闻Month"产生绯闻;Year"
例如:
Sales-APR-2019.csv
Sales-APR-2020.csv
Sales-MAR-2019.csv
Sales-DEC-2019.csv
我在R中的任务是提取2019年全年的某些产品。我将函数设置如下:
myfiles = list.files( pattern="SALES-EXTRACT-...-2019-NEW.csv", full.names=TRUE)
file <- ldply(myfiles, read_csv)
问题来了,文件太大了,所以我不想把它们都加载到r中。如果我有我需要的文章,比如1,2,3,4和5,我如何指定只获取与这些文章相等的列值呢?
最后,我想省略读取所有csv文件的第一行,其中一个文件将被读取为:
file <- read.csv("SALES--APR-2019.csv",header = TRUE)[-1,]
在读取所有文件时,我可以在代码的哪个位置指定[-1,]?
vroom包提供了一个'tidy'方法,在导入过程中按名称选择/删除列。文档:https://www.tidyverse.org/blog/2019/05/vroom-1-0-0/列选择
列选择(col_select)
vroom参数'col_select'使选择要保留(或省略)的列更直接。col_select的接口与dplyr::select()相同。
按名称选择列
data <- vroom("flights.tsv", col_select = c(year, flight, tailnum))
#> Observations: 336,776
#> Variables: 3
#> chr [1]: tailnum
#> dbl [2]: year, flight
#>
#> Call `spec()` for a copy-pastable column specification
#> Specify the column types with `col_types` to quiet this message
按名称删除列
data <- vroom("flights.tsv", col_select = c(-dep_time, -air_time:-time_hour))
#> Observations: 336,776
#> Variables: 13
#> chr [4]: carrier, tailnum, origin, dest
#> dbl [9]: year, month, day, sched_dep_time, dep_delay, arr_time, sched_arr_time, arr...
#>
#> Call `spec()` for a copy-pastable column specification
#> Specify the column types with `col_types` to quiet this message
Use the selection helpers
data <- vroom("flights.tsv", col_select = ends_with("time"))
#> Observations: 336,776
#> Variables: 5
#> dbl [5]: dep_time, sched_dep_time, arr_time, sched_arr_time, air_time
#>
#> Call `spec()` for a copy-pastable column specification
#> Specify the column types with `col_types` to quiet this message
加载多个文件并选择特定列并跳过第一行:
files <- fs::dir_ls(glob = "SALES*2019.csv")
data <- vroom(files, col_select = c(article_1, article_2, article_3, etc), skip = 1)
如果文章信息存储在每个文件的article
列中,您可以尝试-
library(tidyverse)
keep_articles <- 1:5
myfiles = list.files(pattern="SALES-.*-2019.csv", full.names=TRUE)
data <- map_df(myfiles, ~read_csv(.x) %>%
slice(-1) %>%
filter(article %in% keep_articles), .id = 'file')
data
将有一个组合数据帧读取所有csv并保留keep_articles
的行。此外,还将创建一个额外的file
列来区分不同文件的行。