我目前正在使用 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

我想创建一个变量来跟踪每个 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

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

最佳答案

一个快速的 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

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

关于r - 跟踪每一集的第一次发生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59417459/

10-12 17:48