J'ai des données ci-dessous et j'essaie de créer une colonne indicatrice pour conserver une piste d'incrément de la valeur par ID. L'ordre de la date compte ici. p> sortie souhaitée p> données d'entrée mise à jour - p> mise à jour Sortie - P> id rank dates new
1 1 1 2019-06-15 0
2 1 2 2019-07-10 1
3 1 3 2019-08-15 1
4 1 1 2019-09-15 1
5 1 1 2019-10-15 1
6 1 1 2019-11-15 1
7 1 2 2019-12-15 1
8 2 2 2019-10-15 0
9 2 3 2019-11-15 1
10 2 1 2019-12-15 1
11 3 1 2019-11-15 0
12 3 2 2019-12-15 1
13 4 3 2019-12-15 0
14 5 1 2019-10-15 0
15 5 1 2019-11-15 0
16 5 1 2019-12-15 0
3 Réponses :
Assumer que votre trame de données est triée comme vous le souhaitez, voici une solution à l'aide de la base R:
df$new_col_2 = c(0, 1 - diff(df$id)) > df id rank dates new_col new_col_2 1 1 1 2019-06-15 0 0 2 1 2 2019-07-15 1 1 3 1 3 2019-08-15 1 1 4 1 1 2019-09-15 1 1 5 1 1 2019-10-15 1 1 6 1 1 2019-11-15 1 1 7 1 2 2019-12-15 1 1 8 2 2 2019-10-15 0 0 9 2 3 2019-11-15 1 1 10 2 1 2019-12-15 1 1 11 3 1 2019-11-15 0 0 12 3 2 2019-12-15 1 1 13 4 3 2019-12-15 0 0
Nous pouvons utiliser diff code> sur les "dates" après le regroupement par "id"
update h3>
Cela suppose que toutes les dates sont séparées d'une journée. Est-ce le cas?
@Icecreamtoucan C'est un code de mise à jour. Je n'ai pas initialement eu le vecteur logique
@akrun Cela devrait être basé sur le rang. Votre code échoue pour les données d'échantillonnage mis à jour.
@akrun s'il vous plaît vérifier maintenant.
Vous pouvez utiliser rep code> et organiser également les dates, comme vous avez dit qu'ils étaient importants:
C'est-à-dire que la première ligne de chaque
ID code> doit être
0 code> et toutes les autres valeurs de la colonne
new_col code> doit être
1 code> Indépendamment des valeurs des colonnes
Rank code> et
dates code>, est-ce correct?
@Rushabhpatel pas clair pourquoi 14 et 15ème sont tous les deux 0. Il y a une date de changement de 2019-11-15 à 2019-12-15
@akrun je m'excuse que c'était la faute de frappe. Je l'ai mis à jour
S'il vous plaît vérifier ma mise à jour
Si l'interprétation de Markus est correcte, vous pouvez utiliser
setdt (df) [ nouveau: = remplacer (rep (1L, .n), rleid (rang) == 1L, 0L), id] code>