J'ai une trame de données configurée comme suit:
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
J'essaie essentiellement de créer un indicateur binaire, un emplacement est dans une rencontre précédente pour chaque groupe d'ID. Cela ressemblerait donc à:
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
J'essayais de comprendre comment faire une instruction if comme:
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
Mais cela a le problème où la ligne 9 obtient un 1 incorrectement attribué, et il y a des cas avec plus de 15 rencontres dans les données réelles, donc cela devient assez lourd. J'espérais trouver un moyen de faire quelque chose comme
lag(df$Location, 1:df$Encounter)
Mais je sais qu'il a lag()
besoin d'un entier pour k, afin que cette commande spécifique ne fonctionne pas.
r
dataframe
dplyr
duplicates
Dalton K
la source
la source
Réponses:
Une option avec
duplicated
la source
Dans la base R, nous pouvons utiliser
ave
groupé parid
etLocation
et tourner toutes les valeurs de la deuxième ligne du groupe à 1.En utilisant
dplyr
, ce seraitla source
En utilisant
data.table
:Les données:
la source
Une
data.table
solution plus générique utiliserait.N
ourowid
:ou
la source
Vous pouvez également utiliser ceci:
la source