创建 ID 变量:如果 ≥1 列重复,则标记为重复

Create ID variable: if ≥1 column duplicate then mark as duplicate

我见过很多关于基于多列条件创建新 ID 变量的问题。但是,通常如果 var1 AND var2 是双精度,则标记为重复数字。

我的问题是如何创建新的变量 ID 并标记重复项 if

  1. var1 重复,或者
  2. var2 重复,或者
  3. var3 重复。

示例数据集(已编辑)

      pat         var1   var2       var3     
 1     1          1      10           1       
 2     2          16     10          11       
 3     3          21     27           2       
 4     4          22     29           2       
 5     5          31     35           3       
 6     6          44     47           4       
 7     7          5      50           5       
 8     8          6      60           6       
 9     9          7      70           7       
10    10          8      80           7       
11    11          9      90           8       
12    12         10      11           9       
13    13         11      13           91      
14    14         11      14           10     
15    15         NA      15           15
16    16         NA      15           16
17    17         12      NA           17
18    18         13      NA           18

 sample <- data.frame(pat = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18), 
                     var1 = c(1,16,21,22,31,44,5,6,7,8,9,10,11,11, NA,NA,12,13), 
var2 = c(10,10,27,29,35,47,50,60,70,80,90,11,13,14,15,15,NA,NA),
                     var3 = c(1,11,2,2,3,4,5,6,7,7,8,9,91,10,15,16,17,18)

因此,如果三个 var 变量之一重复,则新的 ID 变量应显示重复的 ID 号。

期望的输出(已编辑)

      pat         var1   var2       var3     ID
 1     1          1      10           1       1
 2     2          16     10          11       1
 3     3          21     27           2       2
 4     4          22     29           2       2
 5     5          31     35           3       3
 6     6          44     47           4       4
 7     7          5      50           5       5
 8     8          6      60           6       6
 9     9          7      70           7       7
10    10          8      80           7       7
11    11          9      90           8       8
12    12         10      11           9       9
13    13         11      13           91      10
14    14         11      14           10      10
15    15         NA      15           15      11
16    16         NA      15           16      11
17    17         12      NA           17      12
18    18         13      NA           18      13

我找不到基于类似条件的问题,因此我提出了这个问题。 非常感谢。

EDIT 如果不存在 NA 值,Ben 的回答是完美的。不幸的是,我没有提到我在 var1,2 或 3 中也有 NA 值。NA 值意味着 Var1/2/3 的 idnumber 丢失了。所以我稍微调整了问题并添加了一些 NA 值。 添加的问题是:

脚本是否可以判断:if var1=c(NA,NA), var2=(1,1) and var3=(1,2) to report a duplicate but if var1=c(NA ,NA), var2=c(1,2) 和 var3=(1,2) 来报告一个唯一的数字?

也许您可以尝试以下方法。这里我们使用 tailhead 来引用第 2 行到第 14 行与第 1 行到第 13 行的比较(有效地将每一行与前一行进行比较)。

我们可以使用每行与前一行之间的 rowSums 差异。如果差异为零,则结果为 TRUE(或 1),并且 ID 将逐行增加每个 1 值。这些用 cumsum.

累计求和

使用 c 将使第一个 ID 1。此外, cumsum 调整 1 以占初始 ID 1.

sample$ID <- 
  c(1, cumsum(rowSums(tail(sample[-1], -1) == head(sample[-1], -1)) == 0) + 1)

sample

输出

   pat var1 var2 var3 ID
1    1    1   10    1  1
2    2   16   10   11  1
3    3   21   27    2  2
4    4   22   29    2  2
5    5   31   35    3  3
6    6   44   47    4  4
7    7    5   50    5  5
8    8    6   60    6  6
9    9    7   70    7  7
10  10    8   80    7  7
11  11    9   90    8  8
12  12   10   11    9  9
13  13   11   13   91 10
14  14   11   14   10 10

编辑:根据下面的评论,在某些情况下应该忽略值为 NA 的情况。在上面的示例中,NA 重复(例如第 17-18 行中的 var2)不算重复。

这是另一种方法。您可以使用 sapply 遍历 data.frame.

的行号

您可以使用 mapply 从给定行的旁边的行中减去每个变量,并检查 any 的值是否为零。请注意 na.rm = T 将忽略缺失的 NA 值。

sample$ID <-
  c(1,
    cumsum(
      sapply(
        seq_len(nrow(sample)-1),
        \(x) {
          !any(mapply(`-`, sample[x, -1, drop = T], sample[x + 1, -1, drop = T]) == 0, na.rm = T)
        }
      )
    ) + 1
  )

输出

   pat var1 var2 var3 ID
1    1    1   10    1  1
2    2   16   10   11  1
3    3   21   27    2  2
4    4   22   29    2  2
5    5   31   35    3  3
6    6   44   47    4  4
7    7    5   50    5  5
8    8    6   60    6  6
9    9    7   70    7  7
10  10    8   80    7  7
11  11    9   90    8  8
12  12   10   11    9  9
13  13   11   13   91 10
14  14   11   14   10 10
15  15   NA   15   15 11
16  16   NA   15   16 11
17  17   12   NA   17 12
18  18   13   NA   18 13