我正在使用一些年度和季度数据,我想编写一个循环,每年从四个不同的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,所以我有点嫁给了这种方法......
答案 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
}