2016-05-29 125 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