在R中的多个文件上应用相同的函数

在R中的多个文件上应用相同的函数,r,apply,R,Apply,我是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文件中的日期列是系数,因此我需

我是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文件中的日期列是系数,因此我需要将其更改为日期格式:

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

CAN这应该可以。如果某个部分不起作用,请留下评论。没有经过测试就写了这个

获取当前目录中以名称
结尾的文件列表.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)})

我猜你需要某种指示器,所以这可能很有用。根据文件名的前3个字符创建一个指示符列
rep(子字符串(L,1,3),每个=731)

一个可能的解决方案是以列表的形式将所有文件读入R,然后使用
lappy
将函数应用于所有数据文件。例如:

# 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
解决方案(尽管未经测试,因为未给出可复制的示例):

库(dplyr)

文件列表Thx Daniel~!我已经尝试过你的解决方案,它一直很有效,直到有一点失败。R studio表示:x$Date:$运算符中的错误对于原子向量无效。你知道为什么吗?嗯。。好吧,回头看,我注意到我忘了用
as.character
包装
x$Date
(我对它进行了编辑以解决这个问题),但这似乎不会给你带来那个错误。如果在
lst
上运行
str
,您是否可以看到列表形式的数据?您可以尝试的一件事是根据其位置对其进行索引(例如,如果日期是第二列,则将
x$Date
替换为
x[,2]
)。如果在那一点上它仍然不起作用,那么我不确定发生了什么。Thx太多了!我认为它有效!对于do.call(),还有一个问题,如果我想按column=“Date”查找O列表,我该怎么做?因为现在,do.call(cbind,O)只会返回一个包含多个日期列的表。
date
列应该相互叠加。通过快速的谷歌搜索,听起来其他人也有这个问题。听起来像虫子什么的。尝试跳过
as.Date
步骤,将
Date
保留为
class(character)
。绑定
O
后,对整个列执行
as.Date
。如果这不起作用,请尝试
as.posixct
而不是
as.Date
非常简单的方法!谢谢分享!
# 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)
}) 
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)