R:将一个For循环读取到read.csv()到多个data.frames(),它们的对象名称等于它们各自的* .csv文件名

时间:2017-06-12 21:28:20

标签: r csv dataframe

所以,我一直试图对此进行编码一段时间,但看起来R一直试图将read.csv写入单个data.frame,因为它不断返回“重复行”错误。我需要将每个* .csv作为自己的对象读入数据帧。我试过的代码示例如下;第一个例子是我想要实际实现的代码片段(或接近它的东西)。第二个例子是我尝试重新编码相同功能的原始方法。

#First Example
annual.file.names = list.files(pattern = '* Balance Sheet.csv')
balance.sheet.read = function(x){
  for (i in 1:length(x)) {
    x[i] = data.frame(read.csv(file = x[i], header = T, row.names = 1, skip 
    = 1, blank.lines.skip = T)) #Name assignment needs fixing
  }
}
balance.sheet.read(annual.file.names) #Duplicate row names error
lapply(annual.file.names, balance.sheet.read)#Duplicate row names error



#Second Example
annual.file.names = list.files(pattern = '* Balance Sheet.csv')
balance.sheet.names = function(x){paste0("'", annual.file.names, "'", ",", 
    collapse = '')} #Copy/Paste below
b.sheet.names = c('names; removed in this example; format = *.csv')
b.sheet.file.namer = function(x) { for (i in 1:length(x)){ 
    return(as.character(b.sheet.names[i]))}}
b.sheet.file.names = b.sheet.file.namer(b.sheet.names)
lapply(b.sheet.names, (map_df(as.list(b.sheet.names), (read.csv(file = 
    b.sheet.file.names , header = T, row.names = 1, skip = 1, 
    blank.lines.skip = T)))))
     #Map_df is from Purrr package 
     #Invalid description error
     #sapply also doesn't work

#Extra Samples
balance.sheet.read(b.sheet.names)#Duplicate row names error
lapply(b.sheet.file.names,balance.sheet.read)#Duplicate row names error
sapply(b.sheet.file.names,balance.sheet.read)#Duplicate row names error

2 个答案:

答案 0 :(得分:0)

当您执行list.files()时,这将为您提供一个文件名为元素的向量。因此,您的第一个示例中的问题似乎是您试图将文件x[1]强制(读取)到字符向量中。相反,您可以循环浏览文件名,然后使用x1

将它们逐个读入新的data.frame,例如x2assign()

您可以尝试这样的事情:

annual.file.names = list.files(pattern = '* Balance Sheet.csv')
for (i in 1:length(annual.file.names)){
   assign(paste0("x",i), read.csv(file = annual.file.names[i], header = T, row.names = 1, skip = 1, blank.lines.skip = T))
}  

编辑:

将文件名作为新数据框名称:

annual.file.names = list.files(pattern = '* Balance Sheet.csv')
for (i in 1:length(annual.file.names)){
   assign(annual.file.names[i], read.csv(file = annual.file.names[i], header = T, row.names = 1, skip = 1, blank.lines.skip = T))
} 

或者如果您只想要没有.csv的文件名:

assign(gsub(".csv","",annual.file.names[i]), read.csv(file = annual.file.names[i], header = T, row.names = 1, skip = 1, blank.lines.skip = T))

答案 1 :(得分:0)

annual.file.names <- list.files(pattern = '* Balance Sheet.csv') listDFs <- lapply(annual.file.names, read.csv) combDFs <- do.call("rbind", listDFs)

您可以将每个文件读入data.frames列表,然后使用do.call将数据框绑定在一起并创建一个组合的data.frame。