2017-07-18 6 views
0

remove_funという関数があるとします。この関数は、いくつかの条件に基づいてデータフレームの行数を減らします(この関数にはあまりにも冗長です)。この関数は、入力として2列のデータフレームを取ります。この例ではwhileループからのデータフレーム出力の保存R

block_2_df 
Treatment seq 
     1 29 
     1 23 
     3 60 
     1 6 
     2 41 
     1 5 
     2 44 

、の機能remove_funがblock_2_dfの$の配列は、配列の最大値に基づいて、一度に1行を削除しましょう:例えば、入力dfがblock_2_dfになります好きこれと呼ばれます。

remove_fun(block_2_df) 
Treatment seq 
    1  29 
    1  23 
    1  6 
    2  41 
    1  5 
    2  44 

すなわち配列を含む行== block_2_df 60は、私は、この操作を繰り返しwhileループを作成することができますremove_fun

により除去した。remove_funを適用すると、一度、次のようになり、新たなデータフレームにつながりますblock_2_dfに残りの行の数に基づいてremove_fun介しblock_2_dfに:

while (dim(block_2_df)[1]>1) { 
    block_2_df <- remove_fun(block_2_df) 
    print(remove_fun(block_2_df)) 
} 

このwhileループはを低減しますが1行残るまで(block_2_df$seqの最小値)、block_2_dfの 'updated'バージョンが1行に縮小されるまで出力します。

しかし、私は(すなわち、その後7とblock_2_df、6、次に5 ...、その後、1行)block_2_dfの各「更新」のバージョンを保存したいwhileループから製造します。どうすればこれを達成できますか?私はforループを知っています。これは空のリストのith要素にそれぞれ 'updated' block_2_dfを格納する際に空のリストを作成することで可能です。しかし、私はwhileループで同様のことをする方法がわかりません。このwhileループからの出力としてdfsのリストを持つことは素晴らしいことです。

答えて

2

自分でインデックスカウンタを作成して管理するだけです。 for()ループよりも少し面倒ですが、それはそれだけではありますが、それほど難しくありません。

saved <- list() 
i <- 1 
while (dim(block_2_df)[1]>1) { 
    block_2_df <- remove_fun(block_2_df) 
    saved[[i]] <- block_2_df 
    i <- i + 1 
    print(block_2_df) 
} 

また、あなたがループ内で二回remove_funを呼んでいた、それはあなたがやりたいことはおそらくありませんでした。私はそれを訂正しました、もし私が間違っていたら、そう言いなさい。

+0

私は実際の関数が2つのオブジェクトを出力するので、remove_funを2回呼び出していました(私のコードでは、これらの出力のそれぞれに対して2つの呼び出しがありました)。これはちょうど私が探していたものでした、ありがとう。 – lecreprays