识别行中的相等值
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
我正在尝试复制这个 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