如何将r中的任何一行移动到数据帧的最后一行



如何在R中的数据帧中取一行,并将其移动到最后一行?我看到过允许将其移动到数据帧顶部的命令,但找不到将其移到数据帧底部的命令。感谢您的帮助。

mtcars数据集为例:

df <- head(mtcars, 10)
#                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4

您可以使用此功能将任何一行移动到的最后一个位置

move_to_last <- function(df, n) df[c(setdiff(seq_len(nrow(df)), n), n), ]
move_to_last(df, 4)
#                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
move_to_last(df, 1)
#                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4

如果你对tidyverse解决方案很满意,你可以只使用切片,例如

library(tidyverse)
dat <- data.frame(x = c(1, 2, 3, 4),
y = c(10, 9, 8, 7))
# Moving second row to last position
dat_new <- dat %>%
slice(1, 3:4, 2)

它给出:

x  y
1 1 10
2 3  8
3 4  7
4 2  9

另一种方式:

Last_Row <- function(df, row) {
#just to make sure we do not select a row that is outside of df 
stopifnot(nrow(df) >= row) 

rbind(df[-row, ], df[row, ])

}

假设我们处理来自iris数据集的一些信息:

df <- head(iris[, 1:3])
#    Sepal.Length Sepal.Width Petal.Length
# 1          5.1         3.5          1.4
# 2          4.9         3.0          1.4
# 3          4.7         3.2          1.3
# 4          4.6         3.1          1.5
# 5          5.0         3.6          1.4
# 6          5.4         3.9          1.7

运行Last_Row(df, 1)将生成:

#   Sepal.Length Sepal.Width Petal.Length
# 2          4.9         3.0          1.4
# 3          4.7         3.2          1.3
# 4          4.6         3.1          1.5
# 5          5.0         3.6          1.4
# 6          5.4         3.9          1.7
# 1          5.1         3.5          1.4

一个选项使用seq_len和负数的子设置。

x[c(seq_len(nrow(x))[-2],2),] #Move row 2 to the end
#  a b
#1 1 4
#3 3 2
#4 4 1
#2 2 3

作为一个函数:

move2last <- function(x, r) {
n <- nrow(x)
if(r >= n) x else x[c(seq_len(n)[-r],r),,drop = FALSE]
}
move2last(x, 2)
#  a b
#1 1 4
#3 3 2
#4 4 1
#2 2 3

数据

x <- data.frame(a = 1:4, b=4:1)

相关内容

最新更新