ローカルのドイツ スタイルの数値を含む CSV ファイルをいくつか取得しました。つまり、10.380,45 のように、小数点記号としてコンマを使用し、1000 単位の区切り記号としてポイントを使用します。CSV ファイルの値は「;」で区切られます。ファイルには、文字、日付、日付と時刻、および論理クラスの列も含まれています。
read.table 関数の問題は、dec="," で小数点記号を指定できますが、3 桁区切り記号は指定できないことです。(私が間違っていたら、私を修正してください)
前処理が回避策であることは知っていますが、他の人が自分なしで使用できるようにコードを書きたいと思っています。
次の例に示すように、独自のクラスを設定することで、read.csv2 を使用して CSV ファイルを希望どおりに読み取る方法を見つけました。Rでポイントを3桁区切りとしてcsvをロードする最もエレガントな方法に基づく
# Create test example
df_test_write <- cbind.data.frame(c("a","b","c","d","e","f","g","h","i","j",rep("k",times=200)),
c("5.200,39","250,36","1.000.258,25","3,58","5,55","10.550,00","10.333,00","80,33","20.500.000,00","10,00",rep("3.133,33",times=200)),
c("25.03.2015","28.04.2015","03.05.2016","08.08.2016","08.08.2016","08.08.2016","08.08.2016","08.08.2016","08.08.2016","08.08.2016",rep("08.08.2016",times=200)),
stringsAsFactors=FALSE)
colnames(df_test_write) <- c("col_text","col_num","col_date")
# write test csv
write.csv2(df_test_write,file="Test.csv",quote=FALSE,row.names=FALSE)
#### read with read.csv2 ####
# First, define your own class
#define your own numeric class
setClass('myNum')
#define conversion
setAs("character","myNum", function(from) as.numeric(gsub(",","\\.",gsub("\\.","",from))))
# own date class
library(lubridate)
setClass('myDate')
setAs("character","myDate",function(from) dmy(from))
# Read the csv file, in colClasses the columns class can be defined
df_test_readcsv <- read.csv2(paste0(getwd(),"/Test.csv"),
stringsAsFactors = FALSE,
colClasses = c(
col_text = "character",
col_num = "myNum",
col_date = "myDate"
)
)
私の問題は、さまざまなデータセットに最大 200 列と 350000 行があることです。上のソリューションでは、1 つの CSV ファイルをロードするのに 40 秒から 60 秒かかるため、これを高速化したいと考えています。
私の調査を通じて、パッケージfread()
から見つけましたdata.table
。これは非常に高速です。CSV ファイルの読み込みには約 3 ~ 5 秒かかります。
残念ながら、3 桁区切りを指定することもできません。だから私は自分のソリューションをcolClassesで使用しようとしましたが、個々のクラスをfreadで使用できないという問題があるようですhttps://github.com/Rdatatable/data.table/issues/491
次のテスト コードも参照してください。
##### read with fread ####
library(data.table)
# Test without colclasses
df_test_readfread1 <- fread(paste0(getwd(),"/Test.csv"),
stringsAsFactors = FALSE,
dec = ",",
sep=";",
verbose=TRUE)
str(df_test_readfread1)
# PROBLEM: In my real dataset it turns the number into an numeric column,
# unforunately it sees the "." as decimal separator, so it turns e.g. 10.550,
# into 10.5
# Here it keeps everything as character
# Test with colclasses
df_test_readfread2 <- fread(paste0(getwd(),"/Test.csv"),
stringsAsFactors = FALSE,
colClasses = c(
col_text = "character",
col_num = "myNum",
col_date = "myDate"
),
sep=";",
verbose=TRUE)
str(df_test_readfread2)
# Keeps everything as character
だから私の質問は: fread で 10.380,45 のような数値を持つ CSV ファイルを読み取る方法はありますか?
(代わりに: そのような数値を含む CSV を読み取る最速の方法は何ですか?)