计算连续的行重复
Counting consecutive rowwise duplicates
我目前正在处理具有如下结构的数据
ID
Var1
Var2
Var3
Var4
Var5
Var6
1
1001
1001
1001
2002
2002
2002
2
2002
1001
1001
1001
NA
9999
3
1001
NA
1001
1001
9999
1234
4
3003
3003
3003
NA
2002
2002
5
NA
NA
NA
1001
1001
1001
6
3003
3003
3003
3003
3003
3003
df <- data.frame(ID = c(1, 2, 3, 4, 5, 6),
Var1 = c(1001, 2002, 1001, 3003, NA, 3003),
Var2 = c(1001, 1001, NA, 3003, NA, 3003),
Var3 = c(1001, 1001, 1001, 3003, NA, 3003),
Var4 = c(2002, 1001, 1001, NA, 1001, 3003),
Var5 = c(2002, NA, 9999, 2002, 1001, 3003),
Var6 = c(2002, 9999, 1234, 2002, 1001, 3003))
我的目标是为每一行计算一个唯一值至少连续重复 n 次的次数。假设 n = 3。因此,如果“1001”在 至少 3 个相邻单元格(可能更多)中按行重复,则算作一个重复项。如果“1001”和“2002”在一行中至少连续重复了三次,那么这就是两次重复,等等。以下是预期的结果:
ID
Var1
Var2
Var3
Var4
Var5
Var6
Num_3ConsecutiveDuplications
1
1001
1001
1001
2002
2002
2002
2
2
2002
1001
1001
1001
NA
9999
1
3
1001
NA
1001
1001
9999
1234
0
4
3003
3003
3003
NA
2002
2002
1
5
NA
NA
NA
1001
1001
1001
1
6
3003
3003
3003
3003
3003
3003
1
由于在实际数据中每个变量可能取值的范围很大,并且有超过 40 个变量,因此通过对每个可能值和列范围进行条件化来计算这一点似乎 infeasible/inefficient .任何建议将不胜感激。
您可以使用 rle()
:
library(dplyr)
df %>%
rowwise() %>%
mutate(x = sum(rle(across(-ID))$lengths >= 3))
# A tibble: 6 x 8
# Rowwise:
ID Var1 Var2 Var3 Var4 Var5 Var6 x
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 1 1001 1001 1001 2002 2002 2002 2
2 2 2002 1001 1001 1001 NA 9999 1
3 3 1001 NA 1001 1001 9999 1234 0
4 4 3003 3003 3003 NA 2002 2002 1
5 5 NA NA NA 1001 1001 1001 1
6 6 3003 3003 3003 3003 3003 3003 1
我目前正在处理具有如下结构的数据
ID | Var1 | Var2 | Var3 | Var4 | Var5 | Var6 |
---|---|---|---|---|---|---|
1 | 1001 | 1001 | 1001 | 2002 | 2002 | 2002 |
2 | 2002 | 1001 | 1001 | 1001 | NA | 9999 |
3 | 1001 | NA | 1001 | 1001 | 9999 | 1234 |
4 | 3003 | 3003 | 3003 | NA | 2002 | 2002 |
5 | NA | NA | NA | 1001 | 1001 | 1001 |
6 | 3003 | 3003 | 3003 | 3003 | 3003 | 3003 |
df <- data.frame(ID = c(1, 2, 3, 4, 5, 6),
Var1 = c(1001, 2002, 1001, 3003, NA, 3003),
Var2 = c(1001, 1001, NA, 3003, NA, 3003),
Var3 = c(1001, 1001, 1001, 3003, NA, 3003),
Var4 = c(2002, 1001, 1001, NA, 1001, 3003),
Var5 = c(2002, NA, 9999, 2002, 1001, 3003),
Var6 = c(2002, 9999, 1234, 2002, 1001, 3003))
我的目标是为每一行计算一个唯一值至少连续重复 n 次的次数。假设 n = 3。因此,如果“1001”在 至少 3 个相邻单元格(可能更多)中按行重复,则算作一个重复项。如果“1001”和“2002”在一行中至少连续重复了三次,那么这就是两次重复,等等。以下是预期的结果:
ID | Var1 | Var2 | Var3 | Var4 | Var5 | Var6 | Num_3ConsecutiveDuplications |
---|---|---|---|---|---|---|---|
1 | 1001 | 1001 | 1001 | 2002 | 2002 | 2002 | 2 |
2 | 2002 | 1001 | 1001 | 1001 | NA | 9999 | 1 |
3 | 1001 | NA | 1001 | 1001 | 9999 | 1234 | 0 |
4 | 3003 | 3003 | 3003 | NA | 2002 | 2002 | 1 |
5 | NA | NA | NA | 1001 | 1001 | 1001 | 1 |
6 | 3003 | 3003 | 3003 | 3003 | 3003 | 3003 | 1 |
由于在实际数据中每个变量可能取值的范围很大,并且有超过 40 个变量,因此通过对每个可能值和列范围进行条件化来计算这一点似乎 infeasible/inefficient .任何建议将不胜感激。
您可以使用 rle()
:
library(dplyr)
df %>%
rowwise() %>%
mutate(x = sum(rle(across(-ID))$lengths >= 3))
# A tibble: 6 x 8
# Rowwise:
ID Var1 Var2 Var3 Var4 Var5 Var6 x
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 1 1001 1001 1001 2002 2002 2002 2
2 2 2002 1001 1001 1001 NA 9999 1
3 3 1001 NA 1001 1001 9999 1234 0
4 4 3003 3003 3003 NA 2002 2002 1
5 5 NA NA NA 1001 1001 1001 1
6 6 3003 3003 3003 3003 3003 3003 1