识别行中的相等值

Identify equal values in rows

我正在尝试复制这个 excel 公式:

enter image description here

Excel

 =IF(AND(var1[i+1]=var1[i],var2[i+1]=var2[i],var3[i+1]=var3[i]),0,1)

基本上我需要使用三 (3) 个变量来确定行 [i+1] 是否等于行 [i]:“periodo_ocurr”、“tipo_riesgo”和“paciente” .如果 row[i+1] 等于 row[i] 那么 0 否则 1

R中的代码:

for(i in 1 : nrow(data_ocurr_2019))

{data_ocurr_2019$Flag_Pac[i+1] <- ifelse(data_ocurr_2019$periodo_ocurr[i+1] == data_ocurr_2019$periodo_ocurr[i] & 
                                       data_ocurr_2019$tipo_riesgo[i+1] == data_ocurr_2019$tipo_riesgo[i] &
                                       data_ocurr_2019$paciente[i+1] == data_ocurr_2019$paciente[i], 0, 1)}

这是什么问题?我的数据超过100万条记录,执行起来需要很长时间

还有其他方法吗?效率更高?

任何帮助将不胜感激

尝试:

data_ocurr_2019$Flag_Pac = ifelse(lead(data_ocurr_2019$periodo_ocurr) == data_ocurr_2019$periodo_ocurr & 
                                  lead(data_ocurr_2019$tipo_riesgo) == data_ocurr_2019$tipo_riesgo &
                                  lead(data_ocurr_2019$paciente) == data_ocurr_2019$paciente, 0, 1)

这应该快得多,因为它依赖于矢量化计算,因此 R 可以编译一次代码并立即将其应用于所有行。

R 中矢量化的更多解释:https://www.noamross.net/archives/2014-04-16-vectorization-in-r-why/

您不需要 ifelse 或循环。首先使用 dput 提供可重现的数据进行测试:

test <- structure(list(Var1 = c(5.1, 4.7, 4.6, 4.6, 4.6, 5, 5, 5, 4.6, 
4.4, 4.9, 4.8, 4.3, 5.8, 5.8, 5.4, 5.4, 5.1, 5.1, 5.1), Var2 = c(3.5, 
3.2, 3.1, 3.1, 3.1, 3.6, 3.6, 3.6, 3.4, 2.9, 3.1, 3, 3, 4, 4, 
3.9, 3.9, 3.5, 3.5, 3.8), Var3 = c(1.4, 1.3, 1.5, 1.5, 1.5, 1.4, 
1.4, 1.4, 1.4, 1.4, 1.5, 1.4, 1.1, 1.2, 1.2, 1.3, 1.3, 1.4, 1.4, 
1.5)), row.names = c(NA, -20L), class = "data.frame")

现在比较行:

nrow <- dim(test)[1]
ncol <- dim(test)[2]
match <- rowSums(test[1:(nrow-1), ] == test[2:nrow, ]) == ncol
idx <- which(match) + 1
idx
#  3  4  6  7 14 16 18
#  4  5  7  8 15 17 19 

我们比较相邻的行,然后对行求和以查看所有三列是否匹配。然后我们增加行号,假设你想识别重复的行,而不是前面的行。由于数据的大小,您将无法使用下一行,但它通过此示例说明了结果:

flag <- rep(" ", nrow)
flag[idx] <- "<---"
cbind(test, flag)
#    Var1 Var2 Var3 flag
# 1   5.1  3.5  1.4     
# 2   4.7  3.2  1.3     
# 3   4.6  3.1  1.5     
# 4   4.6  3.1  1.5 <---
# 5   4.6  3.1  1.5 <---
# 6   5.0  3.6  1.4     
# 7   5.0  3.6  1.4 <---
# 8   5.0  3.6  1.4 <---
# 9   4.6  3.4  1.4     
# 10  4.4  2.9  1.4     
# 11  4.9  3.1  1.5     
# 12  4.8  3.0  1.4     
# 13  4.3  3.0  1.1     
# 14  5.8  4.0  1.2     
# 15  5.8  4.0  1.2 <---
# 16  5.4  3.9  1.3     
# 17  5.4  3.9  1.3 <---
# 18  5.1  3.5  1.4     
# 19  5.1  3.5  1.4 <---
# 20  5.1  3.8  1.5