每次遇到值时都创建一个新的数据框

Lea*_*ner 3 r dataframe

我需要根据特定条件分割数据帧,例如,我有一个数据框my_df,其中有一个k没有负值的变量.我需要在my_df每次遇到时拆分这个数据帧0.下面更清楚地解释这是我要创建的代码my_df.

my_df <- data.frame("k" = c(0, 0,0, 0.1,1.3,4,5,7,8,11,14,17,10,5,0.4,0,0,0,1.0,2.3,5,7,3,0.1,0))
Run Code Online (Sandbox Code Playgroud)

执行上面的代码后,我的数据帧如下所示,

    row_number k  
        1      0
        2      0
        3      0
        4      0.1
        5      1.3
        6      4
        7      5
        8      7
        9      8
       10      11
       11      14
       12      17
       13      10
       14       5
       15     0.4
       16       0
       17       0
       18       0
       19     1.0
       20     2.3
       21       5
       22       7
       23       3
       24     0.1
       25       0
Run Code Online (Sandbox Code Playgroud)

当下一个值为零时,我的预期输出被分割成上面的数据帧.即,新的数据帧df1创建包含从值row 1 to 15类似的另一个数据帧df2从创建了包含值row 16 -24,和另一数据帧df3创建具有值从row 25这种情况持续下去直到数据帧的末尾.

我发现split()分割数据框的工作是做的,但我不知道如何在函数中实现我的要求.

jog*_*ogo 5

data.table您可以使用函数rleidv()来创建一个分组变量:

library("data.table")
my_df <- data.frame("k" = c(0, 0,0, 0.1,1.3,4,5,7,8,11,14,17,10,5,0.4,0,0,0,1.0,2.3,5,7,3,0.1,0))
split(my_df, (rleidv(my_df$k==0) - 1) %/% 2)
Run Code Online (Sandbox Code Playgroud)

这是一个基础解决方案R:

r <- rle(my_df$k!=0)
r$values <- gl((length(r$values) + 1) %/% 2, k=2, length=length(r$values))
split(my_df, inverse.rle(r))
Run Code Online (Sandbox Code Playgroud)