根据重复的整数变量和逻辑变量分配ID

assign ID based on duplicate integer variable and logical variable

我无法根据其他 2 列的条件为行分配新 ID。

old_ID       N      n1
1            1      FALSE
2            1      FALSE
3            12     FALSE
4            12     FALSE
5            3      FALSE
6            4      FALSE
7            5      TRUE
8            5      TRUE
9            6      FALSE
10           7      FALSE
sample <- data.frame(old_ID = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14), 
                      N = c(1,1,12,12,3,4,5,5,6,7,8,9,10,11), 
                     n1 = c(FALSE, FALSE,FALSE, FALSE, FALSE, FALSE, TRUE,TRUE,FALSE,FALSE, FALSE,FALSE, FALSE, FALSE))

第 N 列是 class 整数,第 n1 列是 class 逻辑。有 3 种可能的情况:

  1. 如果 N 重复且 n1 为 FALSE,我希望 'newID' 列也显示重复的数字。
  2. 如果 N 重复且 n1 为 TRUE,则 'newID' 应显示唯一编号。
  3. 如果 N 是唯一的,那么 newID 应该显示一个唯一的数字。

期望的输出:

old_ID       N      n1       new_ID
1            1      FALSE     1
2            1      FALSE     1
3            12     FALSE     2
4            12     FALSE     2
5            3      FALSE     3
6            4      FALSE     4
7            5      TRUE      5
8            5      TRUE      6
9            6      FALSE     7
10           7      FALSE     8

这个问题是我在这里提出的一个更大问题的一部分 (Assign ID column based on multiple columns) 但是我认为,正如 Kévin Legueult 所建议的那样,我首先需要为此找到一个解决方案,创建一个新的 variable/column 对于这种情况。

这是 data.table::rleid 的一种方式:

sample$id <- with(sample, data.table::rleid(N + cumsum(n1)))

#> sample
   old_ID  N    n1 id
1       1  1 FALSE  1
2       2  1 FALSE  1
3       3 12 FALSE  2
4       4 12 FALSE  2
5       5  3 FALSE  3
6       6  4 FALSE  4
7       7  5  TRUE  5
8       8  5  TRUE  6
9       9  6 FALSE  7
10     10  7 FALSE  8
11     11  8 FALSE  9
12     12  9 FALSE 10
13     13 10 FALSE 11
14     14 11 FALSE 12

或使用 base Rrle

sample$id <- with(sample, with(rle(N + cumsum(n1)),
     rep(seq_along(values), lengths) ))