2017-08-29 22 views
0

儘管大量的研究和使用lapply(我認爲/希望這是正確的apply函數)的幾個努力,我一直無法實現以下,並希望一些指導。我想要做的是讀取單個目錄中的所有文件,將它們全部合併到一個數據框中,確保每個文件在合併之前刪除前七行。如何將函數應用於特定目錄中的一組.csv文件?

(請注意,所有文件都包含相同的列標題,幷包含相同的數據類型。)

我已經試過這一點,但它顯然達不到的一切我想要實現:

files <- list.files(pattern = "*.csv") # Gather a list of everything in the directory that is a .csv file. 
aconex <- lapply(files, fread) # Use lapply (I think this is correct) to apply the fread() function (from the data.table package) to each .csv file 

這導致所有內容都存儲在向量中,而我希望輸出成爲數據幀。

必須有更好的方法 - 我似乎無法弄清楚。

任何人都可以提出更好的解決方案嗎?

UPDATE:

另外,我已經寫了for環路部分達到我想要的東西;問題是,它不僅節省了數據的單個文件的價值,以數據幀(總共有15個文件):

for(x in list.files(pattern = "*.csv")){ 
    df <- data.table::fread(x) 
    df <- df[-(1:7), ] 
    colnames(df) <- as.character(unlist(df[1,])) 
    df <- df[-(1), ] 
} 

一旦前七行已被刪除,我再申請的第一行作爲列名稱,然後刪除第一行。再一次,有什麼更好的方法來實現這一目標?

理想情況下,我想結果輸出到數據幀或者是X-數(df1df2,..,dfX),然後我可以合併的,但同樣,必須有一個更好的方式 - 是什麼是嗎?

簡而言之,我希望每個文件都被讀入自己的數據框中,然後將row 8的值用作列標題,然後刪除前八行(我只保留第八行以便在刪除它之前將它用於列標題)。

+0

取決於你想要做什麼...'list_files <-list.files(模式(list_files,fread,skip = 7,header = T) result_dataframe <-do.call(list_result,「cbind」)'或'list_files <-list.files(pattern =「* .csv」)list_result < 「* .csv」)list_result <-lapply(list_files,fread,skip = 7,header = T) result_dataframe <-rbindlist(list_results) – user3293236

回答

1

這可以通過創建一個anonymous function來完成,該函數用read.csv進行讀取,然後用skip參數刪除前七行。然後,您可以將所有data.framedo.call一起粘貼。

files <- list.files(pattern = "*.csv") 

#create f, which is a list of data frames 
f <- lapply(files, function(m) df <- read.csv(m, skip = 7, header = TRUE)) 

#stick them all together with do.call-rbind 
f_combine <- do.call("rbind", f) 

如果確實需要通過data.table::fread提供的速度,可以按如下修改代碼:

#create f, which is a list of data frames; modified with fread from data.table 
f <- lapply(files, function(m) df <- fread(m, skip = 7)) 

#use rbindlist this time 
f_combine <- rbindlist(f) 
相關問題