移动多列的行值

Shifting row values for multiple columns

我有以下数据框:

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

如何将 B 列和 C 列中的行向上移动 1 行以获得:

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

我的数据框有 100 多列,因此尝试将其自动化。 感谢您的帮助

library(tidyverse)
xR1 <- xR %>%
  mutate(B = lead(B),
         C = lead(C))

给出:

     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 列进行移位)非常简单:

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

使用基数 R:

xR[,2:3] = rbind(xR[-1,2:3], NA)

然后您可以将 2:3 更改为您想要的所有列。

您可以使用

在多种列中自动执行此操作
xR %>% 
  dplyr::mutate_at(.vars = vars(B:C),
                   .funs = ~ dplyr::lead(.x, 1))

base 中,您可以使用 [-1] 跳过第一个元素,使用 cNA 添加 NA结束:

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

或使用@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

或仅使用子设置:

xR[,-1] <- xR[seq_len(nrow(xR)) + 1, -1]