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

时间:2018-02-21 07:42:26

标签: 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))

执行上述代码后,我的数据框如下所示,

    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

当下一个值为零时,我的预期输出被分割成上面的数据帧。 即,创建包含来自df1的值的新数据框row 1 to 15,同样创建包含来自df2的值的另一个数据框row 16 -24,以及另一个数据框df3创建的值为row 25,持续到数据帧结束。

我发现split()完成了拆分数据框的工作,但我不知道如何在函数中实现我的要求。

2 个答案:

答案 0 :(得分: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)

以下是基础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))

答案 1 :(得分:0)

我们可以使用cumsumdiff创建分组变量,然后使用split&#39; my_df&#39;基于它有list data.frame s

lst <- split(my_df, cumsum(c(TRUE, diff(!my_df$k) ==1)))

lapply(lst, row.names)
#$`1`
#[1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15"

#$`2`
#[1] "16" "17" "18" "19" "20" "21" "22" "23" "24"

#$`3`
#[1] "25"

注意:不使用任何包裹。仅使用 基础R 方法。