【问题标题】:R: applying function on individual csv's in a directory, saving them as one large csvR:对目录中的单个 csv 应用函数,将它们保存为一个大 csv
【发布时间】:2017-04-01 23:11:11
【问题描述】:

所以我有一个文件夹目录(每年,从 1990 年到 2015 年),每个文件夹都有超过 100 多个 csv:

data/1990/alabama.csv
data/1990/alaska.csv
data/1990/arizona.csv
...
data/1991/alabama.csv
data/1991/alaska.csv
data/1991/arizona.csv
...etc.

我正在应用一个函数来清理每个 csv,并将其保存到另一个文件夹中。

到目前为止,我有这个 for 循环,它可以抓取所有文件名并将它们放入一个数据框中,其中每一行都是新的一年:

filepath <- "~/Desktop/project/data"
setwd(dir = filepath)
top_file_dir = dir()
indi_file_name = sapply(top_file_dir, dir)

filename = as.data.frame("", nrow = length(top_file_dir), ncol = 5000, stringsAsFactors = FALSE )
for (i in 1:length(top_file_dir)){
  indi_file_name = sapply(top_file_dir[i], dir)
  for (j in 1:length(indi_file_name))
filename[i,j] = paste(top_file_dir[i],indi_file_name[j],sep="/")
}

然后我有一个相当简单的函数来整理数据集:

general_clean <- function(currfile=filename) {
  geo <- read.csv(file=paste(filepath,currfile,sep="/") , stringsAsFactors=FALSE, colClasses = c("area_fips"="character"))

# remove unwanted columns
keep <- c("area_fips", "year", "area_title")
geoClean <- geo[keep]

# export new data into csv
save_file = paste("~/Desktop/project/output",substring(currfile,21,last=1000),sep="/")
write.csv(geoClean, file=save_file)
}

# apply function, input each year by hand...[1,]=1990, [2,]=1991, etc.
sapply(filename[1,], general_clean)

这行得通,但我想添加一个步骤,将这些较小的 csv 中的每一个每年都放入一个新的 csv 中。这似乎涉及创建一个空列表并在“general_clean”函数中使用 rbind 来继续添加新数据?但这超出了我的 R 能力,到目前为止我所尝试的一切都是猜测。有什么建议吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这应该让你接近。利用list.file(..., full.names = TRUE) 节省大量paste() 调用。

    years <- list.dirs("~/Desktop/project/data", full.names = T, recursive = F)
    # list only the folders in this folder "data"
    
    general_clean <- function(file) {
        geo <- read.csv(file = file,
                        stringsAsFactors = FALSE,
                        colClasses = c("area_fips"="character"))
        keep <- c("area_fips", "year", "area_title") # move all cleaning into your fxn
        geoClean <- geo[keep]
        return(geoClean)
    }
    # move all your cleaning steps into your fxn
    
    for (y in years) {
        year_name <- gsub(".*data/(\\d{4}/.*", "//1", y) # make a year name chr vector
        states <- dir(y, full.names = T) # now list all files in each year
        readin_list <- lapply(states, geoClean) # list of small data frames
        readin_dataframe <- do.call(rbind, readin_list) # make it into a big one
        write.csv(readin_dataframe, paste0("output/", year_name, "/")) # write it out
    }
    

    我 99% 确定这在第一次时不会完美运行,但由于我无法看到您的所有数据,因此这是我最好的猜测,也是一个很好的起点。让我知道出了什么问题,我们可以让它处理您的数据:)

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2020-06-27
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多