移动多列的行值
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]
跳过第一个元素,使用 c
和 NA
添加 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]
我有以下数据框:
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]
跳过第一个元素,使用 c
和 NA
添加 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]