0

私は次のファイルを持っています:

[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    

そのためのコードを書くことは可能ですか?ファイルをタブで区切る必要がありますか?

4

2 に答える 2

0

あなたの質問は完全に明確ではありません。例えば、

  1. ファイルに [1]、[2]、... という数字はありますか?
  2. 偶数行は奇数行の小文字バージョンですか?

数字を無視し、奇数行と偶数行が異なると仮定すると、1 つの解決策は次のようになります。

##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"))

これにより、データ フレームに入れることができる 2 つのベクトルが得られます。

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

空の行は必要ないと思うので、それらを削除してください:

dd[apply(dd, 1, function(i) sum(nchar(i))>0),]
于 2012-10-04T07:00:04.453 に答える
0

このソリューションは @csgillespie のソリューションに似ていますが、すべてが 1 つのコマンドで実行されます (データが読み込まれると)。

データを読み取ります。

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"))
于 2012-10-04T14:24:39.843 に答える