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
我有一个看起来像这样的数据框
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