首页 > 解决方案 > 使用 For 循环创建具有增量后缀的多个对象,然后将 .csv 文件读入每个新对象(也具有增量后缀)

问题描述

我刚开始学习R,所以请原谅我的无知!我正在阅读大量 .csv 文件,每个文件都与不同的年份(2010-2019)相关。然后,我根据其中一列中的变量过滤 .csv 文件(因为数据集非常大。目前我正在使用以下代码执行此操作,然后每年重复一次:

data_2010 <- data.table::fread("//Project/2010 data/2010 data.csv", select = c("date", "id", "type"))

data_b_2010 <- data_2010[which(data_2010$type=="ABC123")]

rm(data_2010)

我想做的是使用 For 循环为每年创建新的对象 data_20xx,然后也读取每年的 .csv 文件(并应用“类型”过滤器)。

我想我知道如何在 For 循环中创建对象,但不完全确定如何分配 .csv 文件并更改文件路径字符串,以便它每年更新(即“//Project/2010 data/2010 data” .csv”到“//Project/2011 data/2011 data.csv”)。

任何帮助将不胜感激!

标签: rfor-loopappendsuffix

解决方案


下次请提供一个可重复的示例,以便我们为您提供帮助。

我会使用data.tablewhich contains 专门的功能来做你想做的事。

library(data.table)
setwd("Project")
allfiles <- list.files(recursive = T, full.names = T)
allcsv <- allfiles[grepl(".csv", allfiles)]
data_list <- list()
for(i in 1:length(allcsv)) {
  print(paste(round(i/length(allcsv),2)))
  data_list[i] <- fread(allcsv[i])
}

data_list_filtered <- lapply(data_list, function(x) {
  y <- data.frame(x)
  return(y[which(y["type"]=="ABC123",)])
})
result <- rbindlist(data_list_filtered)
  1. 首先,list.files默认情况下会告诉您工作目录中包含的所有文件。
  2. 其次,使用快速高效的功能将每个csv文件读入。data_list listfread
  3. 第三,根据要求在循环内进行过滤。
  4. 第四,使用rbindlistfromdata.tablerbind所有这些data.table's。
  5. 最后,如果您不熟悉data.table语法,可以运行setDF(result)将结果转换回data.frame.

我强烈建议您学习data.table语法,因为它对于表格数据操作非常强大且高效。这些小插曲将帮助您入门。


推荐阅读