[英]Loading multiple `csv` files containing comma or period as decimal point
我通常會收到來自歐洲和美國的csv
文件。 來自歐洲的文件有一個逗號,來自美國的文件有一個句點作為小數點。 我希望能夠將所有這些文件放在一個目錄中並使用一個函數加載它們。
最低工作示例:
write.table(data.frame("a" = 1.4, "b" = 2.5), sep = ",",
"periodFile1.csv", dec = ".", row.names = FALSE)
write.table(data.frame("c" = 1.4, "d" = 2.5), sep = ",",
"periodFile2.csv", dec = ".", row.names = FALSE)
我一直在為每種小數點使用單獨的程序。
對於作為小數點的句點,我使用以下內容:
periodNames <- list.files(pattern = "*.csv")
lapply(seq_along(periodNames),
function(x) read.csv(periodNames[x], dec = "."))
以下不是我的例行程序的一部分,但是對於最小工作示例是必需的,否則下一個加載函數將產生錯誤。
file.remove(c("periodFile1.csv", "periodFile2.csv"))
對於逗號作為小數點,我使用以下內容:
write.table(data.frame("e" = 2.7, "f" = 4.5), sep = ";",
"CommaFile1.csv", dec = ",", row.names = FALSE)
write.table(data.frame("g" = 2.7, "h" = 4.5), sep = ";",
"CommaFile2.csv", dec = ",", row.names = FALSE)
commaNames <- list.files(pattern = "*.csv")
lapply(seq_along(commaNames),
function(x) read.csv(commaNames[x], dec = ",", sep = ";"))
無論小數點的類型如何,我都希望能夠將所有文件加載到工作區中。 為此,我希望創建一個加載函數來檢查小數位的類型並使用適當的加載方法。
提前謝謝了
我建議使用readLines
讀取每個文件的幾行並測試內容以確定正確的分隔符。 您必須驗證此測試是否適用於您的數據,但我會從簡單的事情開始,例如查看第一行數據中是否有分號:
grepl(';', line)
然后,使用此功能讀取文件
read_csv_file <- function(file_path){
second_line <- readLines(file_path, n=2)[2]
if (grepl(';', second_line)){
return(read.csv(file_path, dec=',', sep=';'))
}else return(read.csv(file_path))
}
並且這樣稱呼它(我在這里簡化了一些代碼)
allNames <- list.files(pattern = "*.csv")
lapply(allNames, read_csv_file)
您可以使用一個事實,即會有如果列;
不是分隔符。
這應該這樣做:
allNames <- list.files(pattern = "*.csv")
for (i in 1:length(allNames)){
if(dim(read.delim(allNames[i],sep=";"))[2]==1) print(read.csv(allNames[i]))
else print(read.csv2(allNames[i]))
}
當然,您可以在任何地方加載,組合和保存讀取文件,而不是打印。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.