我正在编写一个函数,给定一个路径将找到该文件夹中的所有文件,并将所有csv读取到一个xts对象中。这些文件都具有相同的日期和阵容,我希望每个文件都是xts中的另一列。我得到了以下功能,但我在temp [,1]中得到错误:维数不正确。我做错了什么?
make.libor.xts <- function(folder){
filenames <- list.files(path=folder, full.names=TRUE)
tables <- lapply(filenames, function(x){as.xts(read.zoo(x, sep=",", format="%Y-%m-%d", header=TRUE))})
cnames <- lapply(filenames, function(x){basename(x)})
myxts <- tables[1]
names(myxts) <- cnames[1]
if(length(filenames)>1){
for(i in 2:length(filenames)){
temp <- tables[i]
myxts$cnames[i] <- temp[,1]
}
}
return(myxts)
}
答案 0 :(得分:1)
您的代码可以简化如下。使用Reduce
函数在xts对象列表上调用merge.xts
。
dir("temp")
## [1] "AAPL.csv" "IBM.csv" "MSFT.csv"
READ.ALL.XTS <- function(folder) {
filenames <- list.files(path = folder, full.names = TRUE)
tables <- lapply(filenames, function(x) {
as.xts(read.zoo(x, sep = ",", format = "%Y-%m-%d", header = TRUE))
})
# Lets see contents of tables
cat("Calling from inside function begin...\n")
print(head(tables[[1]]))
print(head(tables[[2]]))
print(head(tables[[3]]))
cat("Calling from inside function end...\n")
cnames <- sapply(filenames, function(x) {
basename(x)
})
combinedxts <- Reduce(f = merge.xts, tables)
names(combinedxts) <- cnames
return(combinedxts)
}
result <- READ.ALL.XTS("temp")
## Calling from inside function begin...
## [,1]
## 2013-01-03 542.10
## 2013-01-04 527.00
## 2013-01-07 523.90
## 2013-01-08 525.31
## 2013-01-09 517.10
## 2013-01-10 523.51
## [,1]
## 2013-01-03 195.27
## 2013-01-04 193.99
## 2013-01-07 193.14
## 2013-01-08 192.87
## 2013-01-09 192.32
## 2013-01-10 192.88
## [,1]
## 2013-01-03 27.25
## 2013-01-04 26.74
## 2013-01-07 26.69
## 2013-01-08 26.55
## 2013-01-09 26.70
## 2013-01-10 26.46
## Calling from inside function end...
head(result)
## AAPL.csv IBM.csv MSFT.csv
## 2013-01-03 542.10 195.27 27.25
## 2013-01-04 527.00 193.99 26.74
## 2013-01-07 523.90 193.14 26.69
## 2013-01-08 525.31 192.87 26.55
## 2013-01-09 517.10 192.32 26.70
## 2013-01-10 523.51 192.88 26.46