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.
r
dataframe
dplyr
duplicates
Dalton K.
quelle
quelle
Antworten:
Eine Option mit
duplicated
quelle
In Basis R können wir
ave
gruppiert nachid
und verwendenLocation
und alle Werte aus der zweiten Zeile der Gruppe auf 1 setzen.Mit
dplyr
wäre dasquelle
Verwenden von
data.table
:Daten:
quelle
Eine allgemeinere
data.table
Lösung wäre.N
oderrowid
:oder
quelle
Sie können dies auch verwenden:
quelle