计算连续的行重复

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