3 votes

comment copier, ou "remplir" comme dans excel, une valeur vers le haut ou le bas d'un certain nombre de lignes

Je ne sais pas comment copier simplement une valeur de data.frame vers le haut ou le bas des lignes par un nombre entier.

Par exemple, si j'ai ce data.frame df :

randcol <- c("s","a","m","p","l", "e","d","a","t","a","h","e","l","l","o")
x <- c(NA,NA,"a",NA,NA,NA,NA,"b",NA,NA,NA,"c",NA,NA,NA)
df <- data.frame(randcol, x)

enter image description here

Je ne sais pas comment mutate() df$x et copier/remplir chaque caractère dans 2 rangs vers le bas, pour réaliser cette nouvelle df :

enter image description here

Quels sont les bons moyens ? Existe-t-il un dplyr Comment ?

Merci. dave

4voto

akrun Points 148302

Nous créons une variable de regroupement en utilisant les valeurs non-NA dans 'x', puis nous effectuons les opérations suivantes replace ment

library(dplyr)
df %>%
   group_by(grp = cumsum(!is.na(x))) %>% 
   mutate(x = replace(x, 2:pmin(3,n()), x[1])) %>% 
   ungroup %>% 
   select(-grp)
# A tibble: 15 x 2
#   randcol x     
#   <fctr>  <fctr>
# 1 s       <NA>  
# 2 a       <NA>  
# 3 m       a     
# 4 p       a     
# 5 l       a     
# 6 e       <NA>  
# 7 d       <NA>  
# 8 a       b     
# 9 t       b     
#10 a       b     
#11 h       <NA>  
#12 e       c     
#13 l       c     
#14 l       c     
#15 o       <NA>  

Une autre option consiste à faire le fill puis remplacer les numéros de ligne supérieurs à 3 par NA après regroupement par 'x'.

df %>%
   tidyr::fill(x) %>% 
   group_by(x1 = x) %>% 
   mutate(x = case_when(row_number() >3 ~ NA_character_,
                      TRUE ~ as.character(x))) %>%
   ungroup %>% 
   select(-x1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X