我需要根据特定条件拆分数据框,例如,我有一个数据框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()
完成了拆分数据框的工作,但我不知道如何在函数中实现我的要求。
答案 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)
我们可以使用cumsum
和diff
创建分组变量,然后使用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 方法。