2013-03-14 4 views
0

저는 R에 익숙하지 만, 이것이 답을 찾을 수 없었던 특정 문제 인 것 같습니다.R-rbind 단일 행렬 행렬

는 내 프로그램이 일부 데이터를 읽어

는, 나는 그것을 통과 열 번호의 벡터를 기반으로 여러 데이터 프레임 중 하나에 데이터의 특정 열을 rbinds, 그래서 이런 식으로 뭔가 :

filename <- c("vector", "full", "of", "filenames") 
colVal <- (32)  
InMat <- data.frame() 
for (i in 1:length(filename)){ 
    file <- read.table(filename[i], header=TRUE, fill=TRUE, stringsAsFactors=FALSE) 
    InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal)]) 
    #...other matricies... 
} 

내 문제의 거짓말 원하는 열이 하나 뿐인 경우, 즉 colVal은 하나의 값을 취합니다. 이 경우 InMat은 본질적으로 내가 필요로하는 것에서 바뀌 었습니다. 나쁘게, 다중 파일을 읽을 때, 그것은 옮겨 놓은 원하는 열을 rbind합니다. 그래서 나는 각 파일의 각 원하는 열에 행이있는만큼 많은 열을 가지고 읽고있는 파일의 수와 같은 수의 행을 얻습니다.

두 개의 원하는 열이있는 경우 (예 : colVal이 두 개 이상의 값을 가짐) 예상대로 작동합니다 (예 : 열이 InMat에 열로 저장되고 각 추가 파일의 열이 저장 됨). 이하).

내 질문에 왜 하나의 원하는 열 값이 전달되면 rbind가 다르게 작동하며 쉬운 방법 (읽기만하면 clunky if 또는 for 루프를 검사하지 않음)이 발생하면이를 피하려면 어떻게해야합니까?

감사합니다.

답변

0

짧은 대답 rbind뿐만 아니라보다 훨씬 빠를 것이다 대신 행렬 C를 사용하여

InVec <- c() 
for (i in 1:length(filename)){ 
    file <- read.table(filename[i], header=TRUE, fill=TRUE, stringsAsFactors=FALSE) 
    InVec <- c(InVec, file[-1, colVal)]) 
    #...other matricies... 
} 

()의 벡터로 모든 값을 추가하면 좋을 것입니다 데이터 프레임)은 기본적으로 출력을 가능한 한 가장 작은 차원 (drop=TRUE 인수를 통해)으로 변환합니다. 하나의 컬럼을 당기는 경우 벡터로 변환 한 다음 rbind을 통해 다른 벡터가있는 행렬을 행렬에 만듭니다. 두 개 이상의 열을 추출하면 데이터 프레임이 생성되므로 rbind의 출력은 데이터 프레임입니다.

빠른 수정이 줄을 변경하는 것입니다

InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal)]) #old line 
InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal),drop=FALSE]) #new line 

lapply를 사용하여 한 번 rbind를 호출하는 것이 코딩보다 R-같은 방법입니다. R은 할당에 따라 할당되기 때문에 연속적으로 연결/추가하여 오브젝트를 증가시키는 것은 상당히 비효율적입니다 (R Inferno의 두 번째 원 참조). 당신은 당신이 사전에 추출 할 컬럼의 위치를 ​​알고있는 경우

filename <- c("vector", "full", "of", "filenames") 
colVal <- (32)  
dfm <- lapply(filename, read.table 
    , header=TRUE, fill=TRUE, stringsAsFactors=FALSE) 
dfm <- lapply(dfm,`[`,colVal) 
dfm <- do.call(rbind,dfm) 

, 당신은 read.tablecolClasses 인수를 사용하여 전체 테이블을 읽는 건너 수 :

filename <- c("vector", "full", "of", "filenames") 
colVal <- 32 
cc <- rep.int("NULL",40) #where 40 is # of columns in table 
cc[colVal] <- NA 
dfm <- lapply(filename, read.table 
    , header=TRUE, fill=TRUE, colClasses=cc, stringsAsFactors=FALSE) 
dfm <- do.call(rbind,dfm) 
+0

어떤 이유로 코드가 느리게 실행 되더라도 제대로 작동합니다. –

+0

코드를 느리게 만드는 부분은 무엇입니까? –

+0

R GUI 콘솔에서 코드를 실행하면 lapply의 첫 번째 호출이 느려지는 것처럼 보입니다. 2 ~ 5 초 정도 멈 춥니 다. (참고로 두 번째 추천 코드를 사용하고 있습니다.) –

0

한 열만 사용하면 벡터가됩니다. [.data.frame합니다 ([ 오퍼레이터 : 당신은 그냥

+0

내가 실행 해요 생각을 이 벡터에 대한 작업을 수행하려고 여기에 문제가 있습니다. 여러 파일을 읽었으므로 길이가 서로 다르기 때문에 일관되지 않은 행 번호로 끝나고 인쇄 할 수 없습니다. –

+0

어떤 작업을 수행하고 있습니까? – LostLin

+0

매트릭스 중 일부는 최소/최대 열을 필요로하며 다른 것은 의미하며 마지막으로 모두 csv 파일에 기록해야합니다. 데이터는 30 분 단위로 파일별로 월별로 나뉩니다. 그래서 일부 파일은 30 * 48, 29 * 48 등입니다 ... –