1
votes

Décalage des valeurs de ligne pour plusieurs colonnes

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


1 commentaires

Écrivez une fonction qui effectue le décalage shift_1 <- function(x) c(x[-1], x[1]) et appliquez-la à vos données xR[, cols] <- lapply(xR[, cols], shift_1) , où cols est un vecteur de caractères des noms de colonnes, c'est-à-dire cols <- c("B", "C")


4 Réponses :


0
votes
xR1 <- xR %>%
  mutate(across(-A, lead))

1 commentaires

Merci @deschen mais j'ai beaucoup de colonnes, donc je ne sais pas comment le faire pour chaque colonne. Merci



1
votes

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.


0 commentaires

0
votes

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))


0 commentaires

3
votes

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


5 commentaires

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