2017-07-18 68 views
0

假设我有一个名为remove_fun的函数,它根据某些条件减少了数据帧的行数(该函数在这个问题中过于冗长)。该函数以2列为输入数据帧。例如,输入DF称为block_2_df可以看看喜欢这样的:在R中存储while循环的数据帧输出

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行。应用remove_fun一旦将导致新的数据帧,看起来像这样:

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

即含有序列排在== 60 block_2_dfremove_fun

删除我可以创建一个while循环,其重复此操作经由remove_funblock_2_df根据行中剩余的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的'更新'版本,直到它被缩减为一行。

然而,我想保存的block_2_df每个“更新”版本(即block_2_df 7,然后如图6所示,然后5,...,然后1行)从while循环产生的。我怎样才能做到这一点?我知道for循环,这可以通过创建一个空列表来存储空列表中的ith元素中的每个“已更新”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

我在调用remove_fun两次,但只是因为我的真实函数输出两个对象(所以在我的代码中,我对这些输出中的每一个都有两次调用)。这正是我想要的,谢谢。 – lecreprays