0

我想对数据框中的某些行组合进行编号(按 ID 和时间排序)

tc <- textConnection('
id              time       end_yn   number
abc             10         0        1
abc             11         0        2
abc             12         1        3 
abc             13         0        1 
def             10         0        1
def             15         1        2
def             16         0        1
def             17         0        2
def             18         1        3
')

test <- read.table(tc, header=TRUE)

目标是创建一个新列 (" journey_nr"),根据其所属的旅程为每一行提供一个唯一编号。旅程被定义为每行的序列,id直到end_yn == 1,如果end_yn从未变为 1,旅程也应该被编号(参见预期结果示例)。对于一个 ID ,只能end_yn == 0在行集合的末尾有旅程(如 id 3 的第 4 行所示)。因此,要么没有end_yn == 1发生该 ID,要么发生在end_yn == 0-journey 之前(参见id == abc示例)。

我知道如何使用data.table包进行编号,但我不知道要组合哪些列才能获得预期的结果。我data.table在 SO 上搜索了 -tag,但找不到类似的问题。

预期结果:

id              time       end_yn   number    journey_nr
abc             10         0        1         1
abc             11         0        2         1
abc             12         1        3         1
abc             13         0        1         2
def             10         0        1         3
def             15         1        2         3
def             16         0        1         4
def             17         0        2         4
def             18         1        3         4
4

2 回答 2

4

试试这个:

tc$journey <- cumsum(as.numeric(c(0, head(tc$end_yn, -1)) | c(0, diff(as.numeric(tc$id))))) + 1

tc
#    id time end_yn number journey
# 1 abc   10      0      1       1
# 2 abc   11      0      2       1
# 3 abc   12      1      3       1
# 4 abc   13      0      1       2
# 5 def   10      0      1       3
# 6 def   15      1      2       3
# 7 def   16      0      1       4
# 8 def   17      0      2       4
# 9 def   18      1      3       4
于 2012-11-05T11:26:16.530 回答
3

另一个基本 R 答案:

test$journey <- cumsum(c(1,head(test$number,-1)) >= test$number)

结果:

> test
   id time end_yn number journey
1 abc   10      0      1       1
2 abc   11      0      2       1
3 abc   12      1      3       1
4 abc   13      0      1       2
5 def   10      0      1       3
6 def   15      1      2       3
7 def   16      0      1       4
8 def   17      0      2       4
9 def   18      1      3       4
于 2012-11-05T12:06:17.767 回答