对 R 中的多个文件应用相同的函数
applying same function on multiple files in R
我是 R 程序的新手,目前正在处理一组财务数据。现在我的工作目录下有大约 10 个 csv 文件,我想分析其中一个并对其余 csv 文件应用相同的命令。
以下是这些文件的所有名称:("US%10y.csv"、"UK%10y.csv"、"GER%10y.csv"、"JAP%10y.csv"、"CHI%10y.csv"、"SWI%10y.csv" ,"SOA%10y.csv", "BRA%10y.csv", "CAN%10y.csv", "AUS%10y.csv")
例如,因为CSV文件中的Date列是Factor所以我需要将它们更改为Date格式:
CAN <- read.csv("CAN%10y.csv", header = T, sep = ",")
CAN$Date <- as.character(CAN$Date)
CAN$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
CAN_merge <- merge(all.dates.frame, CAN, all = T)
CAN_merge$Bid.Yield.To.Maturity <- NULL
all.dates.frame是连续731天的数据框。我想合并它们,以便每个文件都具有相同的行数,这样我就可以将 10 个文件组合在一起以获得 731 X 11 的主数据框。
我当然可以复制并粘贴这段代码并更改文件名,但是有没有简单的方法可以使用 apply 或 for 循环来做到这一点???
非常感谢您的帮助。
这应该可以解决问题。如果某个部分不起作用,请发表评论。没测试就瞎写了
获取当前目录中以 .csv
结尾的文件列表
L = list.files(".", ".csv")
遍历每个名称并读取每个文件,执行您要执行的操作,return data.frame DF_Merge
并将它们存储在列表中。
O = lapply(L, function(x) {
DF <- read.csv(x, header = T, sep = ",")
DF$Date <- as.character(CAN$Date)
DF$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
DF_Merge <- merge(all.dates.frame, CAN, all = T)
DF_Merge$Bid.Yield.To.Maturity <- NULL
return(DF_Merge)})
把所有的DF_Merge
data.frame绑定成一个大的data.frame
do.call(rbind, O)
我猜您需要某种指标,所以这可能会有用。根据文件名的前 3 个字符创建一个指标列 rep(substring(L, 1, 3), each = 731)
一种可能的解决方案是将所有文件以列表的形式读入R,然后使用lapply
对所有数据文件应用一个函数。例如:
# Create vector of file names in working direcotry
files <- list.files()
files <- files[grep("csv", files)]
#create empty list
lst <- vector("list", length(files))
#Read files in to list
for(i in 1:length(files)) {
lst[[i]] <- read.csv(files[i])
}
#Apply a function to the list
l <- lapply(lst, function(x) {
x$Date <- as.Date(as.character(x$Date), format = "%m/%d/%y")
return(x)
})
希望对您有所帮助。
A dplyr
解决方案(虽然未经测试,因为没有给出可重现的示例):
library(dplyr)
file_list <- c("US%10y.csv", "UK%10y.csv", "GER%10y.csv","JAP%10y.csv", "CHI%10y.csv", "SWI%10y.csv","SOA%10y.csv", "BRA%10y.csv", "CAN%10y.csv", "AUS%10y.csv")
can_l <- lapply(
file_list
, read.csv
)
can_l <- lapply(
can_l
, function(df) {
df %>% mutate(Date = as.Date(as.character(Date), format ="%m/%d/%y"))
}
)
# Rows do need to match when column-binding
can_merge <- left_join(
all.dates.frame
, bind_cols(can_l)
)
can_merge <- can_merge %>%
select(-Bid.Yield.To.Maturity)
我是 R 程序的新手,目前正在处理一组财务数据。现在我的工作目录下有大约 10 个 csv 文件,我想分析其中一个并对其余 csv 文件应用相同的命令。
以下是这些文件的所有名称:("US%10y.csv"、"UK%10y.csv"、"GER%10y.csv"、"JAP%10y.csv"、"CHI%10y.csv"、"SWI%10y.csv" ,"SOA%10y.csv", "BRA%10y.csv", "CAN%10y.csv", "AUS%10y.csv")
例如,因为CSV文件中的Date列是Factor所以我需要将它们更改为Date格式:
CAN <- read.csv("CAN%10y.csv", header = T, sep = ",")
CAN$Date <- as.character(CAN$Date)
CAN$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
CAN_merge <- merge(all.dates.frame, CAN, all = T)
CAN_merge$Bid.Yield.To.Maturity <- NULL
all.dates.frame是连续731天的数据框。我想合并它们,以便每个文件都具有相同的行数,这样我就可以将 10 个文件组合在一起以获得 731 X 11 的主数据框。
我当然可以复制并粘贴这段代码并更改文件名,但是有没有简单的方法可以使用 apply 或 for 循环来做到这一点???
非常感谢您的帮助。
这应该可以解决问题。如果某个部分不起作用,请发表评论。没测试就瞎写了
获取当前目录中以 .csv
L = list.files(".", ".csv")
遍历每个名称并读取每个文件,执行您要执行的操作,return data.frame DF_Merge
并将它们存储在列表中。
O = lapply(L, function(x) {
DF <- read.csv(x, header = T, sep = ",")
DF$Date <- as.character(CAN$Date)
DF$Date <- as.Date(CAN$Date, format ="%m/%d/%y")
DF_Merge <- merge(all.dates.frame, CAN, all = T)
DF_Merge$Bid.Yield.To.Maturity <- NULL
return(DF_Merge)})
把所有的DF_Merge
data.frame绑定成一个大的data.frame
do.call(rbind, O)
我猜您需要某种指标,所以这可能会有用。根据文件名的前 3 个字符创建一个指标列 rep(substring(L, 1, 3), each = 731)
一种可能的解决方案是将所有文件以列表的形式读入R,然后使用lapply
对所有数据文件应用一个函数。例如:
# Create vector of file names in working direcotry
files <- list.files()
files <- files[grep("csv", files)]
#create empty list
lst <- vector("list", length(files))
#Read files in to list
for(i in 1:length(files)) {
lst[[i]] <- read.csv(files[i])
}
#Apply a function to the list
l <- lapply(lst, function(x) {
x$Date <- as.Date(as.character(x$Date), format = "%m/%d/%y")
return(x)
})
希望对您有所帮助。
A dplyr
解决方案(虽然未经测试,因为没有给出可重现的示例):
library(dplyr)
file_list <- c("US%10y.csv", "UK%10y.csv", "GER%10y.csv","JAP%10y.csv", "CHI%10y.csv", "SWI%10y.csv","SOA%10y.csv", "BRA%10y.csv", "CAN%10y.csv", "AUS%10y.csv")
can_l <- lapply(
file_list
, read.csv
)
can_l <- lapply(
can_l
, function(df) {
df %>% mutate(Date = as.Date(as.character(Date), format ="%m/%d/%y"))
}
)
# Rows do need to match when column-binding
can_merge <- left_join(
all.dates.frame
, bind_cols(can_l)
)
can_merge <- can_merge %>%
select(-Bid.Yield.To.Maturity)