创建 ID 变量:如果 ≥1 列重复,则标记为重复
Create ID variable: if ≥1 column duplicate then mark as duplicate
我见过很多关于基于多列条件创建新 ID 变量的问题。但是,通常如果 var1 AND var2 是双精度,则标记为重复数字。
我的问题是如何创建新的变量 ID 并标记重复项 if
- var1 重复,或者
- var2 重复,或者
- 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) 来报告一个唯一的数字?
也许您可以尝试以下方法。这里我们使用 tail
和 head
来引用第 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
我见过很多关于基于多列条件创建新 ID 变量的问题。但是,通常如果 var1 AND var2 是双精度,则标记为重复数字。
我的问题是如何创建新的变量 ID 并标记重复项 if
- var1 重复,或者
- var2 重复,或者
- 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) 来报告一个唯一的数字?
也许您可以尝试以下方法。这里我们使用 tail
和 head
来引用第 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