2016-05-29 58 views
1

我是R的新学习者,我不知道如何从目录中读取数据。 我写的函数用于读取名称为“001.csv”,“002.csv”的csv文件...我不知道是否有任何快捷方式可以避免使用“if else”添加“00”或“0”。 此外,还有一个错误,因为我无法使用数据[i](类型为'closure'的对象不是子集合)。那么如何保存我的数据?如何使用R读取目录中的文件

reading <- function(directory, id = 1:500){ 
     for(i in length(id)){ 
     if(id[i]<10) 
      index <- paste("00",id[i], sep = "") 
     else if(id[i]<100) 
      index <- paste("0",id[i], sep = "") 
     else 
      index <- id[i] 

     data[i] <- read.csv(paste(directory,"/",index,".csv",sep = "")) 
     } 
    } 
+0

第二 “重复” 真的是重复的。 –

回答

0

我们可以使用sprintf

files <- sprintf('%03d.csv', 1:500) 
files1 <- paste(directory, files, sep="/") 

或者在单行

files1 <- sprintf('%s/%03d.csv', directory, 1:500) 
lapply(files1, read.csv, sep="") 

如果我们使用的功能

reading <- function(directory, id = 1:500){ 
    files1 <- sprintf('%s/%03d.csv', directory, id) 
    lapply(files1, read.csv, sep="") 
} 

或用for循环功能

reading <- function(directory, id = 1:500){ 
    data <- vector('list', length(id)) 
    for(i in seq_along(id)){ 
     file <- sprintf('%s/%03d.csv', directory, id[i]) 
     data[[i]] <- read.csv(file, sep="") 
     } 
    data 
} 
+0

谢谢!但我如何访问每个文件?当我输入data [1]时,它只返回[[1]] NULL – Ziwei

+0

@Zwei该函数的输出是一个'list'。即'lst < - readling(yourdirectory,id = 1:500); lst [[1]]' – akrun

+0

另一个问题,我如何像数据框一样查看我的文件?我发现我不能做像lst [[1]] $ ID ... – Ziwei

0

更versital做法也许:

folder_files <- list.files(path = "~/Documents/My Directory/", 
         pattern = "//d+.csv", ignore.case = T, full.names = T) 
#you can freely adjust pattern to any regular expression which helps in the 
#long term if you have a different pattern you want to catch 

readin_df <- data.frame() 
for (f in folder_files) { 
    df <- read.csv(f, sep = "") 
    readin_df <- rbind(df, readin_df) 
    } 
+0

我想操作系统只想读取某些文件,而不是基于函数中输入的所有文件。 – akrun

+0

我明白你的观点。我试图展示如何使用list.files(pattern =“abc”)来对目录进行子集化 – Nate