2016-10-19 8 views
0

私はfruit.txtファイルを持っています。ただ、このような :fruit.txtファイル内の200個のなどのブロックがありますtxtファイルの内容を抽出してループする方法

1. 
"No": Apple 
price<-c(92, 79, 51) 
shop.location<- c(5, 3, 2) 
visit.freq<-c(28, 20, 16) 

2. 
"No": Pear 
price<-c(56, 44, 14) 
shop.location<- c(4, 5, 6) 
visit.freq<-c(24, 67, 23) 

3....... 

私は別のvalue.Rコードを持って、それだけでこのようなものです:fruit.txt内の各ブロックに対して

## Start 


income <- price * visit.freq 
compete <- price * shop.location * visit.freq 
first.price <- price[1] 
c(first.price, income, compete) 
## End 

、私はvalue.Rstartincome

price<-c(x, x, x, x, x) 
shop.location<- c(x, x, x, x, x) 
visit.freq<-c(x, x, x, x, x) 

を配置する必要がありますコード。これは私にとって大きな仕事になります。ですから、このプロセスをループする便利な方法はありますか、ありがとうございます。

私の期待される結果は次のとおりです。

first.price income1 income2 income3 compete1 compete2 compete3 
      92 2576 1580  816 12880  4740  1632 
      56 1344 2948  322  5376 14740  1932 
      ..................................................... 
      x  x  x  x  x  x  x 

ありがとうございました。

答えて

0

それぞれのブロックは常に正確に5行ありますか?ブロック間には常に正確に1つの空白行がありますか?いずれかの答えが「いいえ」の場合、これはより複雑になります。

ブロックがすべて正確に(順序を含めて)一致する場合は、readlines関数を使用してブロックを読み込み、行列に変換して、各「変数」が行であり、各ブロックが列サブセットを使って各 "変数"を取得することもできます)。

次に、情報を抽出する方法が必要です。 parseevalを使用することをお勧めしますが、ここでは動作しますが危険で、バグを見つけにくい場合もあります。

代わりにgsubfnパッケージ、具体的にはstrapply機能を使用します。

library(gsubfn) 
myprices <- strapply(myblocks[3,], '[-0-9.]+', as.numeric) 

その後、他の変数と同じことを実行します。データは文字列の行列である場合たとえば、あなたのようなすべての価格が取得することができます。この場合、myprices変数は、各要素が数字のベクトルであるリストになります。

することはでき、その後のようなものを持つループ:...は、追加のコードに置き換えられ

for(i in seq_len(ncol(myblocks))) { 
    price <- myprices[[i]] 
    ... 
    income <- price * visit.freq 
    ... 
} 

自動印刷はループ内で行われないので、結果を印刷するように指示する必要があります。

または結果を保存する場合はループの代わりにlapplyまたはsapply関数を使用します(これは、上記のコードを関数にラップすることを意味します)。

編集

単純なアプローチは動作しませんので、我々はほんの少しより創造的にする必要があります。readLinesを使用してすべてのデータを読み取ることができます。次に、greplを使用して変数の1つのセットにアクセスします(すべてのブロックが上記のように1つの行を持っている、つまりすべて価格が割り当てられ、今、価格は使用取得する:。

w <- grepl('^price', myblocks) 
myprices <- strapply(myblocks[w], '[-0-9.]+', as.numeric) 

と同じ考えを再び他のラインの

+0

(いくつかのブロックは、1つまたは複数の注釈線を有する)ありがとうしかし、実際にはない、すべてのブロックが5行が含まれています。空白行の数は変わる可能性があります。複雑です。 – lightsnail

+0

@lightsnail、まだ実行可能です。 –

関連する問題