J'ai vu beaucoup de questions sur la vectorisation des boucles, mais je n'ai trouvé aucune question impliquant la vectorisation d'une boucle for pour remplir une cellule en fonction de la valeur d'une cellule dans une rangée ci-dessous (Excuses si je suis juste aveugle si ...). J'ai un dataframe avec 1,6 million de lignes de salaires et la date à laquelle chaque personne a commencé à gagner ce salaire. Chaque personne peut avoir plusieurs salaires, et donc plusieurs lignes, chacune avec une date différente qu'elle a été mise à jour.Opération itérative vectorisée sur les lignes
Code pour un jeu de données factice est la suivante:
df1 <- data.frame("id" = c(1,1,2,2,3,3,4,4,5,5,6,6),
"salary" = c(15456,16594,
17364,34564,
34525,33656,
23464,23467,
16794,27454,
40663,42743),
"start_date" = sample(seq(as.Date('2016/01/01'),as.Date(Sys.Date()), by="day"), 12))
df1 <- df1[order(df1$id,df1$start_date),]
Je veux créer une colonne avec une date de fin pour chaque salaire, qui est calculé comme le jour précédant l'entrée de salaire ultérieure. S'il n'y a pas d'entrée de salaire subséquente, alors il est fixé comme date du jour. Ceci est mon code, y compris une boucle, pour le faire:
df1$end_date <- Sys.Date()
for (i in 1:(nrow(df1)-1)){
if(df1[i,1]== df1[i+1,1]){
df1[i,4] <- df1[i+1,3]-1
}
print(i)
}
Cependant, je sais que for
boucles ne sont pas la façon la plus efficace, mais comment pourrais-je aller sur ce vectorisation?
Cela fonctionne pour la première ligne pour chaque id, mais ensembles la dernière rangée pour chaque id est égale au jour avant la date de la première rangée, alors que je suis après la date du jour. – cstaff91
ah, j'ai mal lu "aujourd'hui". Pas de problème, voir l'édition. – BigDataScientist
Bang, merci! – cstaff91