2014-04-04 13 views
1

ff 패키지를 사용하여 R (크기 : 3.7 백만 행, 180 열)의 데이터 세트를 R에 읽으려고합니다. 데이터 집합에는 요인, 논리 및 숫자와 같은 여러 데이터 유형이 있습니다.read.csv.ffdf()를 사용하면 오류가 발생합니다.

숫자 변수를 읽을 때 문제가 발생합니다. 예를 들어, 내 열 중 하나입니다 : 내가의 데이터를 읽어하려고하면

TotalBeforeTax 
126.9 
88.0 
124.5 
90.9 
... 

, 다음과 같은 오류가 발생 :

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    scan() expected 'a real', got '"126.90000"' 

내가 (이미 numeric로 선언 된 것 integer에 클래스를 선언하는 시도)를 사용하지만 아무 소용이 없습니다. 또한 (즉,이 뜻 무엇이든) a real로 변경 시도하고 데이터 읽기 시작하지만, 어떤 점에서 던졌습니다 :

Error in methods::as(data[[i]], colClasses[i]) : 
    no method or default for coercing “character” to “a real” 

(그것이 NA과 아무튼 건너 오기 때문에 내 생각이다

재미있는 점은 열을 factor으로 선언하면 모든 것이 잘 읽히는 것입니다.

무엇을 제공합니까?

+0

또한보십시오 http://stackoverflow.com/questions/22357396/ff-in-r-no-applicable-method-for-recodelevels – jwijffels

답변

2

그래, 나는 원시적 인 해결 방법을 사용하여 이것을 해결할 수 있었다. 먼저 csv 파일 분할기 응용 프로그램을 사용하여 .csv 파일을 분할합니다. 그런 다음 다음 코드를 실행하십시오.

## First, set the folder where the split .csv files are. Set the file names. 

sourceDir <- "split_files_folder" 
sourceFile <- paste(sourceDir,"common_name_of_split_files", sep = "/") 

## Now set the number of split pieces. 

pieces <- "some_number" 

## Set the destination folder for the tab-delimited text files. 
## Set the output file name. 

destDir <- "destination_folder" 
destFile <- paste(paste(destDir, "datafile", sep = "/"), "txt", sep = ".") 

## Now, initialize the loop. 

for (i in 1:pieces) 
{ 
    temp <- read.csv(file = paste(paste(sourceFile, i, sep = "_"), "csv", sep = ".")) 
    if (i == 1) 
    { 
    write.table(temp, file = destFile, quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) 
    } 
    else 
    { 
    write.table(temp, file = destFile, append = TRUE, quote = FALSE, sep = "\t", row.names = FALSE, col.names = FALSE) 
    } 
} 

그리고 voila! 거대한 탭으로 구분 된 텍스트 파일이 있습니다!

+0

답변을 주셔서 감사합니다, @ neuron. 루프의 속도를 향상시키기 위해 read.csv 대신 data.table 패키지에서 fread()를 사용하는 것이 좋습니다. 함수 fread는 아마도 이러한 벤치 마크에서 볼 수 있듯이 데이터 집합을 읽는 가장 빠른 방법입니다. https://rpubs.com/dpastoor/benchmark-nm-read 및 –

0

문제는 숫자 126.9000는 견적 "에 둘러싸여 것 같다. 그래서 어쩌면 당신은 첫 번째 문자로 변수를 얻을 둘째 모든 불필요한 문자를 제거하고, 마지막 숫자에 변수를 변환해야합니다.

+0

나는 또한 생각했다, 그러나 나는'read.csv' 처음 몇 천 줄을 읽는 기능, 그것은 매력처럼 작동합니다. 게다가, 나는 보통의 방법과 똑같이'ff' 데이터 프레임에서 컬럼의 타입을 변경할 수 있을지 확신하지 못합니다. – neuron

+0

@ssantic r-devel 목록에서이 문제에 대한 토론이 있습니다 : https://stat.ethz.ch/pipermail/r-devel/2013-September/067605.html.그 해결책은 거기에 주어진 아니에요 ... –

1

해결 방법 1

당신은 ffbase 패키지에서 laf_to_ffdf을 시도 할 수 비슷해 :.

library(LaF) 
library(ffbase) 

con <- laf_open_csv("yourcsvfile.csv", 
    column_names = [as character vector with column names], 
    column_types = [a character vector with colClasses], 
    dec=".", sep=",", skip=1) 

ffdf <- laf_to_ffdf(con) 

또는 경우

library(LaF) 
library(ffbase) 

m <- detect_dm_csv("yourcsvfile.csv") 
con <- laf_open(m) 
ffdf <- laf_to_ffdf(con) 

해결 방법 2

사용하여 문제가되는 열에 대한 character의 열 클래스와 read.csv.ffdftransFUN 인수에 숫자에 열을 캐스팅 : 당신은 자동으로 유형을 감지 할

ffdf <- read.csv.ffdf([your regular arguments], transFUN = function(d) { 
    d$offendingcolumn <- as.numeric(d$offendingcolumn) 
    d 
}) 
+0

불행히도, 읽기 함수는 문자를 지원하지 않습니다 (당신은'.vimplemented'로 검사 할 수 있습니다), 그리고 오류를 throw합니다. 인자로 로딩을 시도하고'transFUN'으로 다시 수치로 변환했지만 잘못된 값을줍니다. – neuron

+0

그래서 원시적 인 해결 방법을 사용하여 문제를 해결했습니다. 저는 CSV 스플리터 응용 프로그램을 사용하여 파일을 각각 50,000 행의 관리 가능한 청크로 분할합니다. 그런 다음, 청크를로드 한 다음, 탭으로 구분 된 텍스트 파일로 내보내는 R 스크립트를 작성했습니다. 다음 청크를로드하고, 내보내고, 이미 생성 된 텍스트 파일에 출력을 첨부하는 등의 작업을 수행했습니다. 'read.delim.ffdf' 함수는 숫자 나 정수 값을로드 할 때 아무런 문제도 일으키지 않았습니다. – neuron

+0

@ssantic 너무 좋지 않아 두 번째 해결 방법이 작동하지 않았습니다. 아마도 colClasses가 변경 될 때'read.csv.ffdf'가 그것을 좋아하지 않는다는 사실과 관련이 있습니다. 그리고 첫 번째 (가능한) 솔루션? –

관련 문제