2011-12-05 4 views
3

이 질문은 이전 질문 인 Importing one long line of data into R의 후속 조치입니다.공백이있는 긴 한 줄의 데이터를 가져 오기 R

나는 한 줄의 텍스트로 구성된 커다란 데이터 파일을 가지고있다. 형식은

Cat 14   15 Horse 16 

과 비슷합니다. 결국 data.frame으로 가져오고 싶습니다. 위의 예에서 나는 두 변수, 두 변수, Animal과 Number로 끝날 것입니다. 각 "줄"의 문자 수는 고정되어 있으므로 위의 예에서 각 줄은 11자를 포함하고 동물은 처음 7 자이고 숫자는 다음 4 자입니다. 아니 (15)는 모든 동물 공간 카운트 공간 - 당신이해야 데이터를 설명하는 방식에서 확실 무엇

Animal Number 
    Cat  14 
    NA  15 
Horse  16 
+0

나는 당신이 의미하는 것을 이해하지 못합니다. 이 파일이 고정 폭 파일이라는 것을 말하고 있습니까? 각 동물은 7 자이고 각 수는 4 자입니다. – Andrie

+1

왜이 질문을 반복하셨습니까? 방금 본거야. 나는 그 차이를 얻지 못하겠습니까? –

+0

+1 질문을 편집하면 질문에 대한 답이 분명합니다. 신속한 개정에 감사드립니다. –

답변

2

: 여기

inp.fwf <- read.fwf("tmp.txt", widths = rep(c(7, 4), times = 3), as.is = TRUE) 

를 인수 샘플 데이터 times = 3 작품; 실제 파일의 경우 몇 쌍이 있는지 표시하고 이에 따라 times을 변경해야합니다. 당신은 당신이 얼마나 많은 항목을 알 수없는 경우이 작동 할 수 있습니다 : 이것은 하나의 행 많은 열이 당신에게 data.frame을 줄 것이다

inp.rl <- readLines("tmp.txt") 
nchar(inp.rl)/11 

. 이를 여러 행과 두 개의 열로 나누어야합니다.

inp.mat <- matrix(inp.fwf, byrow = TRUE, ncol = 2) 

이렇게하면 올바른 모양의 데이터를 얻을 수 있습니다. 동물 이름은 문자 벡터로 저장됩니다.이 문자는 요인으로 변경하려는 것이지만, 지금은 모든 데이터가 R에 있으므로 쉽게 조정할 수 있습니다.

1

:

그래서 내가 원하는 것은과 같은 데이터 프레임 동물 ...

어쨌든 15 가지가 있어서는 안되는 한 접근법입니다.

list1<-"Cat 14 Horse 16" 

x <- unlist(strsplit(list1, " ")) 
      x <- as.data.frame(matrix(x, length(x)/2, 2, byrow = TRUE)) 
      x[, 2] <- as.numeric(as.character(x[, 2])) 
      x[, 1] <- as.character(x[, 1]) 
names(x) <-c('animal', 'count') 
x 
1

텍스트 파일이 test.dat이고 반복되는 동물 번호 쌍이 있다고 가정합니다.

x <- scan("test.dat", what=list("", 0)) 
my.df <- data.frame(Animal = x[[1]], Number = x[[2]]) 
당신은 열 폭과 열 수 지정 read.fwf으로 파일을 읽을 수
1

타일러의 read.fwf 사용은 아마도 더 깨끗하지만 다른 방법이 있습니다.

x <- readLines(textConnection("Cat 14   15 Horse 16 ")) 
x <- matrix(strsplit(x, "")[[1]], nrow=11) 
d <- data.frame(Animal = apply(x[1:7,], 2, paste, collapse=""), 
       Number = as.numeric(apply(x[8:11,], 2, paste, collapse=""))) 
2

벡터화 된 하위 문자열 기능이있는 솔루션.

x <- readLines(textConnection("Cat 14   15 Horse 16 ")) 
idx <- seq.int(1,nchar(x),by=11) 
vsubstr <- Vectorize(substr,vectorize.args=c("start","stop")) 
dat <- data.frame(Animal= vsubstr(x,idx,idx+6), 
        Number= as.numeric(vsubstr(x,idx+7,idx+10))) 
+0

+1 멋지게 완료되었습니다. 나는 substr을 사용하는 것에 대해 생각했지만 시도한 코드는 추한 느낌을 받았다. Vectorize를 사용하면 멋지게 보입니다. – Aaron

관련 문제