J'ai le dataframe suivant:
xR1 <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), "B" = c(13.6, 8.4, 6.7, 5.6, 2.0, NA, NA, NA), "C" = c(NA, 8.5, 2.43, 1.23, NA, NA, NA, NA))
Comment décaler les lignes des colonnes B et C d'une ligne vers le haut pour obtenir:
xR <- data.frame("A" = c(15, 13.5, 12, 9.1, NA, NA, NA, NA), "B" = c(NA, 13.6, 8.4, 6.7, 5.6, 2.0, NA, NA), "C" = c(NA, NA, 8.5, 2.43, 1.23, NA, NA, NA))
Mon dataframe a plus de 100 colonnes, j'essaie donc de l'automatiser. Merci de votre aide
4 Réponses :
xR1 <- xR %>% mutate(across(-A, lead))
Merci @deschen mais j'ai beaucoup de colonnes, donc je ne sais pas comment le faire pour chaque colonne. Merci
En utilisant la base R:
xR[,2:3] = rbind(xR[-1,2:3], NA)
Ensuite, vous pouvez modifier le 2:3
pour toutes les colonnes que vous souhaitez.
Vous pouvez automatiser cela sur une large sélection de colonnes avec
xR %>% dplyr::mutate_at(.vars = vars(B:C), .funs = ~ dplyr::lead(.x, 1))
En base, vous pouvez utiliser [-1]
pour sauter le premier élément et c
avec NA
pour ajouter NA
à la fin:
xR[,-1] <- xR[seq_len(nrow(xR)) + 1, -1]
ou modification en place en utilisant les pensées de @Ricardo:
xR[,-1] <- rbind(xR[-1,-1], NA) xR # A B C #1 15.0 13.6 NA #2 13.5 8.4 8.50 #3 12.0 6.7 2.43 #4 9.1 5.6 1.23 #5 NA 2.0 NA #6 NA NA NA #7 NA NA NA #8 NA NA NA
ou en utilisant uniquement un sous-paramètre:
data.frame(xR[1], lapply(xR[-1], function(x) c(x[-1], NA))) # A B C #1 15.0 13.6 NA #2 13.5 8.4 8.50 #3 12.0 6.7 2.43 #4 9.1 5.6 1.23 #5 NA 2.0 NA #6 NA NA NA #7 NA NA NA #8 NA NA NA
A part cela @ GKi- est-il possible de décaler la colonne B d'une ligne vers le haut, la colonne C de 2 lignes et ainsi de suite? Merci
Essayez: xR[,-1] <- lapply(seq_len(ncol(xR)-1), function(i) c(xR[-seq_len(i),i+1], rep(NA, i)))
Dernière question @GKi - est-il possible de décaler les valeurs de la colonne B pour qu'elle commence sur la même ligne de la colonne A où la première valeur de la colonne B est inférieure à la colonne A? J'espère que cela a du sens. Sinon, je vais créer un exemple - merci
Peut être? i <- which.max(!is.na(xR$B)); i <- i-which.max(xR$B[i] < xR$A); if(i > 0) c(xR$B[-seq_len(i)], rep(NA, i)) else xR$B
Merci @GKi - cela n'a pas fonctionné - je l'ai posé comme question séparée car je pense que cela aide à mieux l'expliquer - merci encore pour votre aide
Écrivez une fonction qui effectue le décalage
shift_1 <- function(x) c(x[-1], x[1])
et appliquez-la à vos donnéesxR[, cols] <- lapply(xR[, cols], shift_1)
, oùcols
est un vecteur de caractères des noms de colonnes, c'est-à-direcols <- c("B", "C")