我有一个看起来像这样的数据框
数据
Category start_time(need to fill)
Low
Low
Low
Low
Below Normal
Below Normal
Low
Below Normal
Below Normal
Below Normal
我需要将每一行与其前一行进行比较,以及类别是否已更改 我会用1.ie
填充该行的start_time变量If(Category(Row)!= Category(Previous Row)然后设置Start_Time = 1
所以我的最终数据集shoudl看起来像这样
Category Start Time
Low 1 //Initially set to 1
Low 0
Low 0
Low 0
Below Normal 1
Below Normal 0
Low 1
Below Normal 1
Below Normal 0
Below Normal 0
有没有一种简单的方法可以在R.中执行此操作。我相信我可以在R中没有FOR循环的情况下执行此操作。
由于
答案 0 :(得分:2)
我们可以使用data.table
。我们将'data.frame'转换为'data.table'(setDT(df1)
)。从v1.9.6
开始,引入了rleid
函数,只要当前值与前一个值不同,就会给出一个新的分组索引。我们将其用作分组索引,并使用rep
为times
1复制1和0以及为每个组复制组-1(.N-1
)的长度并分配({{ 1}})输出到新列。
:=
或者通过比较'Category'的滞后和超前来给出一个逻辑索引可以更容易地做到这一点,用library(data.table)#v.9.6+
setDT(df1)[, StartTime :=rep(c(1,0), c(1L, .N-1)) , rleid(Category)]
追加,因为长度将比'df1'的nrow少一个并且换行使用TRUE
,以便将逻辑索引强制转换为二进制。
+