选择最后一行并将其放在顶部



我有一个数据框,我想对它重新排序。我想把最后一行作为顶行。

例如,如果我在控制台中输入mtcars,列出的最后一辆汽车是沃尔沃 142E。 假设我想把它作为第一行,我会怎么做?

dplyr/tidyverse 或 base r 首选。

在基数 R 中 -

mtcars[c(nrow(mtcars), seq(nrow(mtcars)-1)), ]
# top 6 rows
mpg cyl disp  hp drat    wt  qsec vs am gear carb
Volvo 142E        21.4   4  121 109 4.11 2.780 18.60  1  1    4    2
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

这是一个通用函数,用于将任何行移动到顶部 -

move_to_top <- function(df, n) {
df[c(n, setdiff(1:nrow(df), n)), ]
}
head(move_to_top(mtcars, 32))
mpg cyl disp  hp drat    wt  qsec vs am gear carb
Volvo 142E        21.4   4  121 109 4.11 2.780 18.60  1  1    4    2
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

这是一个基本的 R 方法,它也适用于最后一行以外的行

to_top <- nrow(mtcars)
mtcars[order(seq(nrow(mtcars)) != to_top),]
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# 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
# ...

to_top <- which(rownames(mtcars) == 'Valiant')
mtcars[order(seq(nrow(mtcars)) != to_top),]
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
# 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
# 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
# ...

您也可以使用setdiff获得相同的结果

mtcars[c(to_top, setdiff(seq(nrow(mtcars)), to_top)),]

或者dplyr中的order方法

library(dplyr)
mtcars %>% 
rownames_to_column() %>% 
arrange(row_number() != n())
#                rowname  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# 1           Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# 2            Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# 3        Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# 4           Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# 5       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# 6    Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
# ...

另一个想法是按行进行子集和绑定,即

rbind(tail(mtcars, 1), head(mtcars, -1))
#                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
#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
#...

我们可以使用slice

library(tidyverse)    
mtcars%>%
rownames_to_column('rn') %>%
slice(c(n(),  1:(n()-1))) %>%
column_to_rownames('rn')
#                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb NA_1 NA_2
#Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2   NA 21.4
#Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4   NA 21.0
#Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4   NA 21.0
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1   NA 22.8
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1   NA 21.4
# ...

最新更新