gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:14:40 24 4
gpt4 key购买 nike

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

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 中有没有一种简单的方法可以做到这一点。我确信我可以在 R 中不用 FOR 循环来做到这一点。

谢谢

最佳答案

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

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

或者这可以通过比较“类别”的滞后和领先来提供逻辑索引来更轻松地完成,并附加 TRUE因为长度将比 'df1' 的 nrow 小 1 并用 + 包裹以便将逻辑索引强制为二进制。
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

关于R 通过读取当前行和上一行创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33396903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com