通过列表或向量将csvs动态地读入R dfs?

时间:2016-03-25 15:11:12

标签: r csv

我正在使用一些年度和季度数据,我想编写一个循环,每年从四个不同的CSV中读取四分之三的数据,然后在它们上运行脚本。

#prep strings

beg <- "fmli"
end <- ".csv"

fileList <- c()

for(i in 1996:2012){
  yearString <- toString(i)
  year <- substr(toString(i), 3,4)
  for(i in 1:4){
    quarter <- toString(i)
    fileToRead <- paste(sep="", beg, year, quarter, end)
    #add to list
    #fileList <- append(fileToRead, i)
  }
  a1 <- read.csv(fileList[1])
  a2 <- read.csv(fileList[2])
  a3 <- read.csv(fileList[3])
  a4 <- read.csv(fileList[4])
}

基本上,我需要通过将年份的4个季度分配给a1-a4来结束这个循环。所以我可以做到这一点:

#I want it to do this, but automated

#1996 quarterly files
a1 <- read.csv("fmli961.csv")
a2 <- read.csv("fmli962.csv")
a3 <- read.csv("fmli963.csv")
a4 <- read.csv("fmli964.csv")

#run the script

#1997 quarterly files
a1 <- read.csv("fmli961.csv")
a2 <- read.csv("fmli962.csv")
a3 <- read.csv("fmli963.csv")
a4 <- read.csv("fmli964.csv")

#run the script again

#etc, etc

我不知道如何在for循环中附加到列表中 - 我明白这可能不是在R中写这个的最有效方法,但是我写了脚本将宿舍分配给DF,所以我有点嫁给了这种方法......

3 个答案:

答案 0 :(得分:3)

使用清单:

beg <- "fmli"
end <- ".csv"

for(i in 1996:2012){
  yearString <- toString(i)
  year <- substr(toString(i), 3,4)
  dataList <- list()
  for(j in 1:4){
    quarter <- toString(j)
    fileToRead <- paste(sep="", beg, year, quarter, end)
    #add to list
    dataList[[j]] <- read.csv(fileToRead)
  }
    names(dataList) <- c("a1", "a2", "a3", "a4")
    # then run your script on dataList[["a1"]], dataList[["a2"]], etc.
}

哎呀,忘了列表的双括号。我似乎总是这样做:/

答案 1 :(得分:1)

以下是我的表现。不要使用for,而只需使用lapply。其中的函数返回的对象将成为列表的一部分。

lapply(setNames(1996:2012, paste0("y", 1996:2012)), function(y) {
  year <- substr(y, 3, 4)
  lapply(setNames(1:4, paste0("a", 1:4)), function(qt) {
    fileToRead <- paste0("fmli", y, qt, ".csv")
    read.csv(fileToRead)
  })
})

使用嵌套的lapply,您最终会得到一个年份列表,其元素是每个季度的data.frames列表。我们使用setNames创建一个命名向量,这些名称将是列表元素的名称(年份和季度)。

请注意,在将数字用作字符串时,您不需要使用toString。在大多数(所有?)函数中,这种强制是自动完成的。

答案 2 :(得分:-1)

我总是使用assign来阅读我的.csv文件。

#prep strings

beg <- "fmli"

end <- ".csv"

a <- c("a1", "a2", "a3", "a4");

for(i in 1996:2012){
  year <- substr(toString(i), 3,4)
  for(j in 1:4){
    quarter <- toString(j)
    fileToRead <- paste(beg, year, quarter, end, sep="")
    assign(a[j], read.csv(file=fileToRead));
  }

  # Now use your script on a1-a4
  # a1-a4 will be overwritten in next iteration

}