2017-01-16 15 views
1

在一個文件夾中,我喜歡24 * .csv文件,它們具有相同的結構,我想創建一個文件。問題是並不是所有的數據框都以相同的方式讀取,因爲對於某些文件來說,sep參數是「,」和其他「;」。 我應該使用什麼方法?我想我可能會放一個if語句。在r中讀取倍數不變的文本文件沒有相同的分隔符

+1

'data.table :: fread'很方便,如果你覺得太懶惰,無法指定分隔符,並且數據格式合理。一般來說,這種方法是通過一個文件名向量''lapply'讀取函數,'do.call(rbind,...)'(或dplyr或data.table變體)結果。 – alistaire

+0

@Ariel愚蠢的問題,但它是不可行的,只是做大規模發現/替換的';'分隔符,使所有的文件是一致的?如果這只是一次性的事情,那麼這可能是最簡單的方法。如果您不得不在持續的基礎上處理它,請考慮對文件進行編碼,以便您知道要使用的分隔符。 –

+0

@MatthewCrews是一種可能性,但在這種情況下,數據中的十進制值是用「,」代替「。」。這可能是一個問題。 – Ariel

回答

2

您可以檢查數據幀的第一行,看它是否有逗號或者分號作爲分隔符,和呼叫後ifelse聲明:

L <- readLines('DataFrame', n = 1) 
if (grepl(";", L)) read.csv2("DataFrame") else read.csv("DataFrame") 
1

下面的簡單代碼所做的工作,而且速度非常快。

library(dplyr) 
library(data.table) 
files <- list.files(path = "Ariel/Trips/", full.names = T) 
f <- list() 
for (i in 1:length(files)) { 
f[[i]] <- fread(files[i], header = T, colClasses = c("factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor", 
                "factor", "integer", "integer", "integer", 
                "factor", "numeric", "numeric", "integer", 
                "factor", "factor", "factor", "factor", 
                "factor", "factor", "factor", "factor")) 
} 
trip <- bind_rows(f) 
fwrite(x = trip, file = "trip.csv", quote = T, na = NA, row.names = F) 
+1

如果你打算用data.frames做更多的事情,而不僅僅是將它們重寫到一個新文件中,fread會默認創建一個data.table,其中的子集有所不同。如果這是一個問題,請使用其'data.table = FALSE'參數。如果你想使用更少的包,你也可以使用'data.table :: rbindlist'來代替'dplyr :: bind_rows'。此外,'lapply'可能會比'for'循環更快,因爲默認情況下,它預先分配內存好一點。 – alistaire

+0

* ...其中有不同的子集.. *是相當含糊的..最近,這種行爲已被固定(大部分)..在那裏可以使用DT [,cols]表現得像一個DF(假設'cols'在DT中不存在)或'DT [,..cols]'查找'DT'範圍外的'cols'(它是列名/索引的char /整數向量)。參見[v1.10.0下的第2點和v1.9.8下的第1點](https://github.com/Rdatatable/data.table/blob/master/NEWS.md)。 – Arun

相關問題