Dans les données ci-dessous, je veux incrémenter les valeurs de cellule après chaque 1, mais le réinitialiser à zéro sur la cellule suivante si Z.out = 1. Voici un exemple.

Données de départ:

Z   B_1 C_1 D_1 E_1 F_1
0   0   0   0   0   0
0   1   0   0   1   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   1   0   0   0
0   0   0   0   0   0
1   0   0   0   0   0
0   0   0   0   0   1
0   1   0   0   0   0
0   0   1   1   0   0
0   0   0   1   0   0
0   1   0   1   0   0
0   0   0   0   0   0
0   0   0   0   0   0
0   0   0   0   0   0
1   0   0   0   0   0
0   0   0   0   1   0
0   0   0   0   0   0

Sortie désirée:

Z   B_1 C_1 D_1 E_1 F_1
0   0   0   0   0   0
0   1   0   0   1   0
0   1   0   0   1   0
0   1   0   0   1   0
0   1   0   0   1   0
0   1   1   0   1   0
0   1   1   0   1   0
1   1   1   0   1   0
0   0   0   0   0   1
0   1   0   0   0   1
0   1   1   1   0   1
0   1   1   2   0   1
0   2   1   3   0   1
0   2   1   3   0   1
0   2   1   3   0   1
0   2   1   3   0   1
1   2   1   3   0   1
0   0   0   0   1   0
0   0   0   0   1   0

Je pense que je peux utiliser df <- df%>% transmute_at (vars (contains ("_ 1")),) pour cibler les bonnes colonnes et les remplacer par la sortie souhaitée, mais je n'ai pas trouvé la syntaxe appropriée pour la partie fonctions de transmuter. J'essaie d'utiliser cumsum () pour transmettre les valeurs à travers chaque colonne, mais lorsque j'essaie de revenir en arrière en fonction de z.out, je me retrouve juste avec des erreurs.

Merci pour l'aide!

r
2
Plot Device 24 sept. 2020 à 22:53

2 réponses

Meilleure réponse

Une dplyr possibilité pourrait être:

df %>%
 group_by(grp = cumsum(Z == 0 & lag(Z, default = first(Z)) == 1)) %>%
 mutate(across(-Z, cumsum))

      Z   B_1   C_1   D_1   E_1   F_1   grp
   <int> <int> <int> <int> <int> <int> <int>
 1     0     0     0     0     0     0     0
 2     0     1     0     0     1     0     0
 3     0     1     0     0     1     0     0
 4     0     1     0     0     1     0     0
 5     0     1     0     0     1     0     0
 6     0     1     1     0     1     0     0
 7     0     1     1     0     1     0     0
 8     1     1     1     0     1     0     0
 9     0     0     0     0     0     1     1
10     0     1     0     0     0     1     1
11     0     1     1     1     0     1     1
12     0     1     1     2     0     1     1
13     0     2     1     3     0     1     1
14     0     2     1     3     0     1     1
15     0     2     1     3     0     1     1
16     0     2     1     3     0     1     1
17     1     2     1     3     0     1     1
18     0     0     0     0     1     0     2
19     0     0     0     0     1     0     2
2
tmfmnk 24 sept. 2020 à 20:03

Comparable à l'approche de tmfmnk, ce qui suit fonctionne également:

df %>% 
  group_by(grp = c(0, lag(cumsum(diff(Z) == 1), 1, 0))) %>% 
  mutate(across(-Z, cumsum)) %>% 
  ungroup()
0
Lennyy 24 sept. 2020 à 20:38