跟踪每一集的第一次发生

bzi*_*ggy 3 r data.table

我目前正在使用 R 来处理如下所示的数据集:

age  ep  
 1    0   
 2    0   
 3    1   
 4    1   
 5    1   
 6    1   
 7    0   
 8    0   
 9    1   
10    1   
11    0   
Run Code Online (Sandbox Code Playgroud)

我想创建一个变量来跟踪每个 ep=1 系列中第一次出现的 ep=1。这些系列的第一个 ep=1 之前的 ep=0 和每个系列的最后一个 ep=1 之后的 ep=0。

我希望数据集在处理后看起来像这样:

 age  ep  first
 1    0   NA
 2    0   NA
 3    1   1
 4    1   NA
 5    1   NA
 6    1   NA
 7    0   NA
 8    0   NA
 9    1   1
10    1   NA
11    0   NA
Run Code Online (Sandbox Code Playgroud)

我在数据表中工作,因为这个数据集相当大,所以我更喜欢使用数据表的代码处理数据,但是如果这不可能,我可以转换为数据框并使用其他代码。任何帮助将不胜感激。

Kha*_*nes 8

一个快速的data.table方法...

library(data.table)

dt <- fread("age  ep  
 1    0   
 2    0   
 3    1   
 4    1   
 5    1   
 6    1   
 7    0   
 8    0   
 9    1   
10    1   
11    0")

dt[!shift(ep) & ep, first := 1]

# or more explicit:
dt[shift(ep) != 1 & ep == 1, first := 1]

dt
#     age ep first
#  1:   1  0    NA
#  2:   2  0    NA
#  3:   3  1     1
#  4:   4  1    NA
#  5:   5  1    NA
#  6:   6  1    NA
#  7:   7  0    NA
#  8:   8  0    NA
#  9:   9  1     1
# 10:  10  1    NA
# 11:  11  0    NA
Run Code Online (Sandbox Code Playgroud)

注意:为了清楚起见,如果您的对象还不是data.table. 您可以将其强制为data.table

setDT(dt)
Run Code Online (Sandbox Code Playgroud)

  • 在这种特殊情况下,您可以将“i”打成“!shift(ep) &amp; ep” (2认同)