在R中的多个文件上应用相同的功能

时间:2015-06-11 19:48:25

标签: r apply

我是R计划的新手,目前正在处理一组财务数据。现在我在我的工作目录下获得了大约10个csv文件,我想分析其中一个并将相同的命令应用于其余的csv文件。

以下是这些文件的所有名称:(" US%10y.csv"," UK%10y.csv"," GER%10y.csv&#34 ;," JAP%10y.csv"," CHI%10y.csv"," SWI%10y.csv"," SOA%10y.csv& #34;," BRA%10y.csv"," CAN%10y.csv"," AUS%10y.csv")

例如,因为CSV文件中的日期列是因子,所以我需要将它们更改为日期格式:

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循环来做到这一点???

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

这应该可以解决问题。如果某个部分不起作用,请发表评论。在没有测试的情况下写下了这个盲人。

获取当前目录中以名称.csv

结尾的文件列表
L = list.files(".", ".csv")

遍历每个文件中的每个名称并读取,执行您要执行的操作,返回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.frames绑定到一个大数据框架

do.call(rbind, O)

我猜你需要某种指标,所以这可能很有用。根据文件名rep(substring(L, 1, 3), each = 731)

的前3个字符创建指标列

答案 1 :(得分:1)

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)

答案 2 :(得分:0)

一种可能的解决方案是以列表的形式将所有文件读入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)
}) 

希望它有所帮助。