Ich habe einen Datenrahmen wie folgt eingerichtet:
df <- data.frame("id" = c(111,111,111,222,222,222,222,333,333,333,333),
"Location" = c("A","B","A","A","C","B","A","B","A","A","A"),
"Encounter" = c(1,2,3,1,2,3,4,1,2,3,4))
id Location Encounter
1 111 A 1
2 111 B 2
3 111 A 3
4 222 A 1
5 222 C 2
6 222 B 3
7 222 A 4
8 333 B 1
9 333 A 2
10 333 B 3
11 333 A 4
Ich versuche im Grunde, ein binäres Flag zu erstellen, in dem sich ein Ort in einer vorherigen Begegnung für jede ID-Gruppe befindet. So würde es aussehen:
id Location Encounter Flag
1 111 A 1 0
2 111 B 2 0
3 111 A 3 1
4 222 A 1 0
5 222 C 2 0
6 222 B 3 0
7 222 A 4 1
8 333 B 1 0
9 333 A 2 0
10 333 B 3 1
11 333 A 4 1
Ich habe versucht herauszufinden, wie man eine if-Anweisung wie folgt macht:
library(dplyr)
df$Flag <- case_when((df$id - lag(df$id)) == 0 ~
case_when(df$Location == lag(df$Location, 1) |
df$Location == lag(df$Location, 2) |
df$Location == lag(df$Location, 3) ~ 1, T ~ 0), T ~ 0)
id Location Flag
1 111 A 0
2 111 B 0
3 111 A 1
4 222 A 0
5 222 C 0
6 222 B 0
7 222 A 1
8 333 B 0
9 333 A 1
10 333 B 1
11 333 A 1
Dies hat jedoch das Problem, dass Zeile 9 fälschlicherweise eine 1 zugewiesen wird, und es gibt Fälle mit mehr als 15 Begegnungen in den tatsächlichen Daten, sodass dies ziemlich umständlich wird. Ich hatte gehofft, einen Weg zu finden, so etwas zu tun
lag(df$Location, 1:df$Encounter)
Aber ich weiß lag()
, dass eine ganze Zahl für k benötigt wird, damit ein bestimmter Befehl nicht funktioniert.