2017-05-21 2 views
0

Je suis novice en programmation R (j'ai programmé toute ma vie dans SAS), et j'ai une question de base à laquelle je n'ai pas trouvé de réponse (J'ai trouvé des réponses à des questions similaires mais pas celle-ci). Imaginez que nous ayons une variable binaire (que nous appellerons "v1") qui peut avoir une valeur de 0 ou de 1. Je voudrais créer une nouvelle variable (que nous appellerons "v2") qui prend sur la valeur d'un ID de cluster unique à chaque fois qu'une nouvelle valeur de 1 apparaît ou une chaîne de 1s apparaissent après un 0. en fin de compte, je voudrais créer « v2 » de v1 comme suit:Affectation d'un ID à des groupes de valeurs de lignes dans R

Obs v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 

Si quelqu'un pourrait faire la lumière sur cela, je serais très reconnaissant. Merci beaucoup.

Répondre

6

Cela fera l'affaire. Il définit les groupes égaux à la somme cumulée du nombre d'augmentations de 1 dans les valeurs de v1, puis remet les 0 à NA.

df$v2 <- cumsum(c(df$v1[1]==1,diff(df$v1)==1)) 
df$v2[df$v1==0] <- NA 
+2

Il semble y avoir un problème si le premier élément de v1 est 1. – Lamia

+0

Oui - excusez-moi - modifié ci-dessus. –

+0

Variation sur ce thème - 'as.numérique (facteur (remplacer (cumsum (! Df $ v1),! Df $ v1, NA)))' – thelatemail

1

Donc, pour une donnée v1:

v1<-c(0,0,1,1,0,1,0,1,1,1,0,1) 
v1_sum <- unlist(lapply(seq_along(1:length(v1)),function(x) sum(v1[1:x])))#create the cumulative sum per index 
v1_sum[v1==0] <- NA#imputing NA values to v1_sum when v1 is 0 
v1_sum_new_vals <- unlist(lapply(seq_along(1:length(v1_sum)),function(x) {sum(is.na(v1_sum[1:x]))-1}))#cumulative sum of NA's per index 
v2 <- ifelse(!is.na(v1_sum),v1_sum_new_vals,v1_sum)#imputing new values based on a condition 

Mettre tous les rendements ensemble

df<-data.frame(v1,v2) 
df 
v1 v2 
1 0 NA 
2 0 NA 
3 1 1 
4 1 1 
5 0 NA 
6 1 2 
7 0 NA 
8 1 3 
9 1 3 
10 1 3 
11 0 NA 
12 1 4 
+0

Merci beaucoup! – user8045187