2016-08-17 5 views
3

로컬 독일어 스타일의 숫자가 포함 된 여러 개의 CSV 파일이 있습니다. 즉 소수 구분 기호로 쉼표를 사용하고 점을 천 단위 구분 기호로 사용합니다. 10.380,45. CSV 파일의 값은 ";"로 구분됩니다. 파일에는 클래스 문자, 날짜, 날짜 & 시간 및 논리의 열도 포함됩니다.R : data.table :: fread를 사용하여 CSV 파일을 읽을 수있는 방법은 십진수로 쉼표가 있고 천 단위 구분 기호 = "."

read.table 함수의 문제점은 dec = ","로 소수 구분 기호를 지정할 수 있지만 천 단위 구분 기호를 지정할 수 없다는 것입니다. (내가 틀렸다면 수정 해주십시오.)

전처리가 해결 방법이지만, 다른 사람들이 나와 함께 사용할 수있는 방식으로 코드를 작성하고 싶습니다.

다음 예제에서 볼 수 있듯이 내 자신의 클래스를 설정하여 read.csv2로 원하는 방식으로 CSV 파일을 읽는 방법을 찾았습니다. 지금 Most elegant way to load csv with point as thousands separator in R

# 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 행까지 가지고. 상위 솔루션을 사용하려면 하나의 CSV 파일을로드하는 데 40 ~ 60 초가 걸리므로 속도를 높이고 싶습니다.

내 연구를 통해 data.table 패키지에서 fread()이라는 패키지를 발견했습니다.이 패키지는 정말 빠릅니다. CSV 파일을로드하는 데 약 3 ~ 5 초가 소요됩니다.

불행히도 천 단위 구분 기호를 지정할 가능성도 없습니다. 그래서 colClasses 내 솔루션을 사용하려고하지만 https://github.com/Rdatatable/data.table/issues/491

도 참조 내 다음 테스트 코드 FREAD 개별 클래스를 사용할 수 없다는 문제가있을 것 같습니다 :

##### 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 

그래서 제 질문 : 10.380,45와 같은 숫자 값을 가진 CSV 파일을 fread로 읽는 방법이 있습니까? (다른 방법 : 이러한 숫자 값을 사용하여 CSV를 읽는 가장 빠른 방법은 무엇입니까?)

미리 답변 해 주셔서 감사합니다. 내 질문이 길지 않았 으면 좋겠어요 .-).

+0

참조 [# 1636] (https://github.com/Rdatatable/data.table/issues/1636). 이것은 결점으로 나를 때린다.'options ("datatable.fread.dec.locale"= "de_DE.utf8")를 설정해도 문제가 해결되지 않는 이유는 확실치 않다. @Arun은 이상하지 않은가? – MichaelChirico

답변

1

, 좋은 그것은 로케일을 처리하기로

https://cran.r-project.org/web/packages/readr/readr.pdf

물건이어야한다 나는 패키지 나 자신을 사용한 적이 있지만, 해들리 위컴에서의 :

locale(date_names = "en", date_format = "%AD", time_format = "%AT", decimal_mark = ".", grouping_mark = ",", tz = "UTC", encoding = "UTF-8", asciify = FALSE)

decimal_markgrouping_mark 당신이 찾고있는 것입니다

,210

편집 양식 PhiSeu : 솔루션 귀하의 제안에

덕분에 여기 readr 패키지에서 read_csv2() 두 솔루션입니다. 내 350000 행 CSV 파일의 경우 약 8 초가 소요되며 read.csv2 솔루션보다 훨씬 빠릅니다. (해들리와 RStudio의 또 다른 유용한 패키지, 감사)

library(readr) 

# solution 1 with specified columns 
df_test_readr <- read_csv2(paste0(getwd(),"/Test.csv"), 
          locale = locale("de"), 
          col_names = TRUE, 
          cols(
          col_text = col_character(), 
          col_num = col_number(), # number is automatically regcognized through locale=("de") 
          col_date2 = col_date(format ="%d.%m.%Y") # Date specification 
          ) 
          ) 

# solution 2 with overall definition of date format 
df_test_readr <- read_csv2(paste0(getwd(),"/Test.csv"), 
          locale = locale("de",date_format = "%d.%m.%Y"), # specifies the date format for the whole file 
          col_names = TRUE 
) 
1

쉼표를 모두 먼저 제거하십시오.

filepath<-paste0(getwd(),"/Test.csv") 
filestring<-readChar(filepath, file.info(filepath)$size) 
filestring<-gsub('.','',filestring,fixed=TRUE) 
fread(filestring) 
+0

이것은 불행하게도 도움이되지 않습니다. fread는 이것을 자동으로 감지합니다 (verbose = TRUE 일 때 인쇄 된 코드를 보면). 나는이를 분명히하기 위해 예제에 추가했다. 하지만 고마워. – PhiSeu

+0

@PhiSeu 죄송합니다. 내 컴퓨터에서 테스트 해본 결과 컴퓨터의 로케일에 대해 불만을 토로 했으므로 컴퓨터가 작동하는지 알려지지 않았습니다. –

+0

문제 없습니다. CSV 파일을 작성하고 읽을 작업 디렉토리의 예에서 문제가 발생할 수 있습니다. RProject (Windows 7)의 컨텍스트에서 예제를 테스트했습니다. 그래서 모든 사람들에게 효과가 없을 수도 있습니다. – PhiSeu