2013-04-26 2 views
1

안녕하세요. NSE Bhavcopy에서 다운로드 한 CSV를 병합 중입니다. 다른 날짜에는 cols의 다른 no가있다. 26-12-2006에 998 개의 행이 있다고 말하십시오. & 27-12-2006 행에는 1003 개의 행이 있습니다. 그것에는 8 개의 cols가있다. 나는 단지 2 cols, Symbol, close price와 함께 & b를 만드는 cbind를한다. 병합을 위해 SYMBOL로 병합 할 수 있도록 colnames를 사용하여 col의 이름을 지정합니다.여러 csv를 R에 합치는 것

질문 :

1) 내가 "기호"= 함수에 의해 병합 사용 모든 = F; 나는 결과가 1011 행을 갖는 것을보고 놀랐다. 내가 읽은 곳은 모두 = 998 행 또는 최대 1003 행이되어야 합니다. 나는 또한 자료를 분석하고 27-12-2006에서 5 개의 다른 상징이다는 것을 것을을 발견했다 & 26-12-2006에서 3 개의 다른 상징. 그래서 "SYMBOL"로 병합하면 두 줄의 새로운 기호가 추가됩니까? 또는 이전의 기존 행과 만 병합됩니까?

2) NSEmerg는 &이 기존 c 파일과 병합 할 때마다 for 루프를 사용하여 새 파일을 읽는 함수입니다. 나는 2006 년 12 월에서 2013 년 4 월까지의 데이터를 가지고있는 약 1535 개의 파일을 가지고있다. 그러나 12 메가 바이트의 오류 벡터 크기를 허용하므로 12 개 이상의 파일을 병합 할 수 없었다. 또한 1535MB의 메모리 할당이 모두 사용되었다는 경고 메시지가 표시됩니다. 또한 12 번째 파일에서 나는 c의 nrow가 1508095라는 루프가 무한히 실행되는 루프임을 암시합니다. 모든 1535 개의 파일 중 가장 높은 행은 1435에있었습니다. 특정 날짜에 상장되지 않은 모든 주식을 추가하더라도 2200 개의 주식을 교차시키지 않을 수도 있습니다. 왜 이것이 1.5 백만의 nrow를 보여 줍니까 ??

3) CSV를 병합하는 더 좋은 방법이 있습니까? 나는 스택 오버플로에 처음으로 다른 사람이 10 개 파일을 첨부했을 것이다.

코드 :

a <- read.csv("C://Users/home/desktop/061226.csv", stringsAsFactors = F, header = T) 
b <- read.csv("C://Users/home/desktop/061227.csv", stringsAsFactors = F, header = T) 
a_date <- a[2,1] 
b_date <- b[2,1] 
a <- cbind(a[,2],a[,6]) 
b <- cbind(b[,2], b[,6]) 
colnames(a) <- c("SYMBOL", a_date) 
colnames(b) <- c("SYMBOL", b_date) 
c <- merge(a,b,by = "SYMBOL", all = F) 

NSEmerg <- function(x,y) { 
    y_date <- y[2,1] 
    y <- cbind(y[,2], y[,6]) 
    colnames(y) <- c("SYMBOL", y_date) 
    c <- merge(c, y, by = "SYMBOL", all = F) 
    } 

filenames = list.files(path = "C:/Users/home/Documents/Rest data", pattern = "*csv") 

for (i in 1:length(filenames)){ 
    y <- read.csv(filenames[i], header = T, stringsAsFactors = F) 
    c <- NSEmerg(c,y) 
    } 

write.csv(c, file = "NSE.csv") 

답변

-1

당신은 아마 펄 한 줄 개시 좋을 것 :

perl -pe1 file1 file2 file3 ... > newfile 

을 다음 당신은 당신이

cut -f1,2 -d"," newfile > result 
을 필요로하는 열을 줄일 수 있습니다
+0

나는 PERL에 대한 단서가 없습니다. 이전에 인용구를 붙여 넣으면 PERL을 사용할 수 없다는 오류가 발생했습니다. 정확한 구문을 알려줄 수 있습니까? 내가 파일 130425.csv, 130423.csv, 130422.csv; 3 파일로 펄에서 새로운 파일을 만드는 법? 모든 3 개의 파일은 작업 디렉토리에만 있습니다. 내가 당신의 코드를 타이핑 할 때, 그것은 저에게 Perl -pe1 130425의 뜻밖의 수치 상수를 말하는 오류를 던졌습니다. 죄송합니다. 다시 말하자면,'pattern' 인자는 정규 표현식이므로, 당신은 마침표를 벗어나야합니다. 그렇지 않다면, 코딩과 R – planetpb

1

cbind이 맞고 rbind이 아닌가요? 마지막 질문에 답하십시오. 첫째로 당신은지도에있는 모든 .CSV 파일을 나열 :

listfiles <- list.files(path="C:/Users/home/desktop", pattern='\\.csv$', full.names=TRUE) 

다음 사용 do.call가 다른 CSV 파일에 읽고 rbind와 조합 할 수 있습니다.

df <- do.call(rbind, lapply(listfiles , read.csv)) 
+2

에 익숙하지 않습니다. 그것은 모든 문자를 의미합니다. 완전한 증거가되고 싶다면 'pattern ='\\. csv $ ''와 같이 문자열 끝을 나타내는 $를 추가해야합니다. –

+0

개선에 감사드립니다. 나는 대답을 업데이트했다. – JT85