在R中存储来自while循环的数据帧输出

时间:2017-07-18 16:35:10

标签: r while-loop

假设我有一个名为remove_fun的函数,它根据某些条件减少了数据帧的行数(此函数过于冗长,无法包含在此问题中)。此函数将具有2列的数据帧作为其输入。例如,名为block_2_df的输入df看起来像这样:

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

对于这个例子,假设函数remove_fun基于block_2_df $ seq中seq的最高值一次删除1行。应用remove_fun一次会产生一个如下所示的新数据框:

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

即,block_2_df中包含seq == 60的行已通过remove_fun删除

我可以创建一个while循环,根据block_2_df中剩余的行数,通过remove_funblock_2_df上重复此操作:

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

此while循环会减少block_2_df,直到剩下1行(block_2_df$seq的最低值),然后打印出block_2_df的“已更新”版本,直到减少为1行。

但是,我想保存block_2_df的每个“更新”版本(即block_2_df,其中包括7,然后是6,然后是5,....,然后是1行) while循环。我怎么能做到这一点?我知道对于for循环,可以通过在空列表中的block_2_df元素中存储每个“已更新”ith时创建一个空列表来完成。但是我不确定如何在while循环中做类似的事情。将dfs列表作为此while循环的输出会很棒。

1 个答案:

答案 0 :(得分:3)

自己创建和维护索引计数器。它比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两次,这可能不是你想要做的。我已经纠正了,如果我错了,请说出来。