我正在努力合并文件,但是发现自己编写的代码非常冗余,这很麻烦。我查看了文档,但是由于某种原因找不到有关该操作的任何信息。
基本上,我从本机上下载代码,然后想要为每个文件合并完全相同的列(唯一的区别是年份)。
你能帮忙吗?
我从计算机上下载代码(先从"C:/SAM/CODE1_2005.csv"
然后是"C:/SAM/CODE1_2006.csv"
然后是"C:/SAM/CODE1_2007.csv"
,直到2016年。
然后我定义列,对于我每年下载的列都是一样的,例如COLLEGESCORECARD05_A<-subset(COLLEGESCORECARD05, select=c(ï..UNITID,OPEID,OPEID6,INSTNM))
等...
,然后将文件合并到一个数据库中。
问题在于,这似乎效率低下。有没有更有效的方法?
答案 0 :(得分:0)
您可以列出文件夹中.csv
个文件的列表,然后使用purrr::map_df
将它们一起读入一个df文件中。您可以添加一列来区分文件,然后
library(tidyverse)
df <- list.files(path="C://SAM",
pattern="*.csv") %>%
purrr::map_df(function(x) readr::read_csv(x) %>%
mutate(filename=gsub(" .csv", "", basename(x)))
答案 1 :(得分:0)
冒着自我促进的危险,我编写了一个函数来完成此操作(desiderata::apply_to_files()
):
# Apply a function to every file in a folder that matches a regex pattern
rain <- apply_to_files(path = "Raw data/Rainfall", pattern = "csv",
func = readr::read_csv, col_types = "Tiic",
recursive = FALSE, ignorecase = TRUE,
method = "row_bind")
dplyr::sample_n(rain, 5)
#> # A tibble: 5 x 5
#>
#> orig_source_file Time Tips mV Event
#> <chr> <dttm> <int> <int> <chr>
#> 1 BOW-BM-2016-01-15.csv 2015-12-17 03:58:00 0 4047 Normal
#> 2 BOW-BM-2016-01-15.csv 2016-01-03 00:27:00 2 3962 Normal
#> 3 BOW-BM-2016-01-15.csv 2015-11-27 12:06:00 0 4262 Normal
#> 4 BIL-BPA-2018-01-24.csv 2015-11-15 10:00:00 0 4378 Normal
#> 5 BOW-BM-2016-08-05.csv 2016-04-13 19:00:00 0 4447 Normal
在这种情况下,所有文件都具有相同的列和顺序(时间,技巧,mV,事件),所以我只能method = "row_bind"
,该函数会自动将文件名添加为额外的列。还有其他可用的方法:
“ full_join”(默认)返回所有列和行。 “ left_join”返回第一个文件的所有行,以及后续文件的所有列。 “ inner_join”返回第一个文件中与后续文件中匹配的行。
在内部,该函数在路径中构建文件列表(是否递归),在列表上运行lapply()
,然后将新的数据帧列表合并为单个数据帧:
apply_to_files <- function(path, pattern, func, ..., recursive = FALSE, ignorecase = TRUE,
method = "full_join") {
file_list <- list.files(path = path,
pattern = pattern,
full.names = TRUE, # Return full relative path.
recursive = recursive, # Search into subfolders.
ignore.case = ignorecase)
df_list <- lapply(file_list, func, ...)
# The .id arg of bind_rows() uses the names to create the ID column.
names(df_list) <- basename(file_list)
out <- switch(method,
"full_join" = plyr::join_all(df_list, type = "full"),
"left_join" = plyr::join_all(df_list, type = "left"),
"inner_join" = plyr::join_all(df_list, type = "inner"),
# The fancy joins don't have orig_source_file because the values were
# getting all mixed together.
"row_bind" = dplyr::bind_rows(df_list, .id = "orig_source_file"))
return(invisible(out))
}