2012-10-04 4 views
0

의 데이터 프레임을 한 줄에 각 단어를 저장하게 나는 다음과 같은 파일이 있습니다루프 각 라인을 통해 및 R

: I 출력 데이터 프레임은 다음과 같은 형태를 갖고 싶어

[1]/tI /tam /tCharlotte 
[2]/ti /tam /tcharlotte 
[3]/tYou /tare /tsmart 
[4]/tyou /tare /tsmart 

word  gloss 
I   i 
am  am  
Charlotte charlotte  
You  you  
are  are  
smart  smart  

코드를 작성할 수 있습니까? 파일을 탭으로 구분해야합니까?

+0

되는 [1], [2], ... 파일 또는 일부는 R에서 그 바로 출력된다? – Dason

+0

"/ t"는 탭 문자입니까? 대부분의 언어는 "\ t"입니다. –

답변

0

이 솔루션은 @csgillespie와 비슷하지만 모든 명령은 한 번 명령으로 수행됩니다 (데이터를 읽은 후).

dat <- read.table(text = "/tI /tam /tCharlotte 
/ti /tam /tcharlotte 
/tYou /tare /tsmart 
/tyou /tare /tsmart", stringsAsFactors = FALSE) 

데이터 프레임을 생성 :

데이터 읽기

structure(
as.data.frame(
    lapply(
    lapply(list(c(TRUE, FALSE), c(FALSE, TRUE)), 
      function(y) lapply(strsplit(
           apply(dat, 1, "paste", collapse = ""), "/t"), 
          function(x) x[nchar(x) > 0])[y]), 
    unlist)), 
.Names = c("word", "gloss")) 
0

귀하의 질문에 완전히 명확하지 않습니다. 예 :

  1. 파일에 [1], [2], ...이 있습니까?
  2. 짝수 행은 홀수 행의 소문자 버전입니까?

번호를 무시하고 홀수 및 짝수 행이 다르다고 가정하면, 하나 개의 솔루션은 다음

dd = data.frame(c1 = c1, c2 = c2) 

:

##Read in the data. 
tmp = read.table(textConnection("/tI /tam /tCharlotte 
/ti /tam /tcharlotte 
/tYou /tare /tsmart 
/tyou /tare /tsmart"), sep="\n", stringsAsFactors=FALSE) 

##Take the odd rows 
##gsub: remove white space 
##strsplit: split the string on "\t" 
##unlist: go from a list to a vector 
c1 = unlist(
    strsplit(
     gsub(" ", "", tmp[seq(1,nrow(tmp), 2),]), "/t")) 

##Ditto the even rows 
c2 = unlist(
    strsplit(
     gsub(" ", "", tmp[seq(2,nrow(tmp), 2),]), "/t")) 

이것은 우리에게 데이터 프레임에 넣어 두 벡터를 준다 빈 행을 원하지 않으므로 그냥 제거하십시오.

dd[apply(dd, 1, function(i) sum(nchar(i))>0),] 
+0

안녕하세요! 코드를 보내 주셔서 감사합니다! 내 실제 파일은 그보다 더 복잡합니다. 따라서 홀수 라인에는 영어가 아닌 언어의 단어가 있고 짝수 라인에는 각 단어에 대한 영어 번역이 있습니다. 파일에는 모두 1200-ish 행이 있습니다. 각 단어와 영어 번역이 함께 쌍으로되어있는 데이터 프레임을 만들고 싶습니다. – charlotte

+0

라인이 페어링 된 경우 'rbind (t (mydata [1 : 2,]), t (mydata [2 : 3,])'를 반복하면 루프가 수행됩니다. N/2 행 쌍에 대해 적용 함수를 적용합니다. –