R通过读取当前行和上一行创建一个新列

R creating a new column by reading the current row and the Previous row

我有一个看起来像这样的数据框

data

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) Then Set Start_Time =1

所以我的最终数据集应该看起来像这样

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.I 中是否有一种简单的方法可以做到这一点我确信我可以在 R 中没有 FOR 循环的情况下做到这一点。

谢谢

我们可以使用data.table。我们将 'data.frame' 转换为 'data.table' (setDT(df1))。从v1.9.6开始,引入了rleid函数,只要当前值与前一个不同,就会给出一个新的分组索引。我们将其用作分组索引,并使用 rep 复制 1 和 0 为 times 1 和组的长度 -1 (.N-1) 为每个组分配 (:=) 输出到新列。

library(data.table)#v.9.6+
 setDT(df1)[, StartTime :=rep(c(1,0), c(1L, .N-1)) , rleid(Category)]

或者这可以更容易地完成,只需比较 'Category' 的滞后和超前以给出逻辑索引,附加 TRUE 因为长度将比 [的 nrow 少一个=29=] 并用 + 换行,以便将逻辑索引强制转换为二进制。

setDT(df1)[,  StartTime := +c(TRUE,Category[-1L]!= Category[-.N])]
df1
#        Category StartTime
# 1:          Low         1
# 2:          Low         0
# 3:          Low         0
# 4:          Low         0
# 5: Below Normal         1
# 6: Below Normal         0
# 7:          Low         1
# 8: Below Normal         1
# 9: Below Normal         0
#10: Below Normal         0