2012-10-04 44 views
0

一個數據幀I具有以下文件:遍歷每一行和每一字存儲在一個線路並進行中的R

[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. 偶數行是奇數行的小寫版本嗎?

忽略數字和假設奇數和偶數行不同,一個解決方案是:

##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 = data.frame(c1 = c1, c2 = c2) 

我認爲你不想要空行,所以只要刪除它們:

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

嗨!感謝代碼!我的實際文件比這更復雜。所以在奇數行中,有來自語言(而不是英語)的單詞,並且在偶數行中,每個單詞都有英文翻譯。文件中共有1200條線。我想創建一個數據框,將每個單詞和他們的英文翻譯配對在一起。 – charlotte

+0

如果這些行是配對的,那麼重複'rbind(t(mydata [1:2,]),t(mydata [2:3,])'會爲你做。顯然你想要一個循環或'*在N/2行對上應用函數。 –

相關問題