如何将两个特定行移动到数据框的顶部?

How to move two specific rows to top of dataframe?

下面我有一个DF

A   B   C   D
a   4   2   2
g   5   2   2  
d   7   65  7
e   3   6   7

我想制作这个 DF,使 A 列第一行有“g”,第二行有“d”。我想通过调用 A 列(而不是索引)中的值来做到这一点。我该怎么做?

理想输出

A   B   C   D
g   5   2   2  
d   7   65  7
a   4   2   2
e   3   6   7

我们可以转换为 factor 并在 arrangeing

之前的订单中指定 levels
library(forcats)
library(dplyr)
DF %>% 
   arrange(fct_relevel(A, 'g', 'd'))
  A B  C D
1 g 5  2 2
2 d 7 65 7
3 a 4  2 2
4 e 3  6 7

fct_relevel,我们可以指定特定级别的顺序而不指定其余级别

> with(DF, fct_relevel(A, 'g', 'd'))
[1] a g d e
Levels: g d a e

数据

DF <- structure(list(A = c("a", "g", "d", "e"), B = c(4L, 5L, 7L, 3L
), C = c(2L, 2L, 65L, 6L), D = c(2L, 2L, 7L, 7L)), class = "data.frame",
 row.names = c(NA, 
-4L))

另一个可能的解决方案:

library(dplyr)

df <- data.frame(
  stringsAsFactors = FALSE,
  A = c("a", "g", "d", "e"),
  B = c(4L, 5L, 7L, 3L),
  C = c(2L, 2L, 65L, 6L),
  D = c(2L, 2L, 7L, 7L)
)

df %>% arrange(match(A, c("g", "d", setdiff(c("g", "d"), A))))

#>   A B  C D
#> 1 g 5  2 2
#> 2 d 7 65 7
#> 3 a 4  2 2
#> 4 e 3  6 7

如果你对外部包不感兴趣,只是为了添加一个基本的 R 解决方案,你可以直接指定行顺序:

# Sample Data
DF <- structure(list(A = c("a", "g", "d", "e"), B = c(4L, 5L, 7L, 3L
), C = c(2L, 2L, 65L, 6L), D = c(2L, 2L, 7L, 7L)), class = "data.frame",
row.names = c(NA, -4L))

此示例的硬代码:

DF2 <- DF[c(2,3,1,4),]

一个更普遍的例子:

# specify desired rows
rownums <- which(DF$A %in% c("g","d"), arr.ind = TRUE)

# Specify other rows
otherrows <- seq(1:nrow(DF))[!(seq(1:nrow(DF)) %in% rownums)]

# Organize
DF2 <- DF[c(rownums,otherrows),]

试试下面的代码

with(
  df,
  df[match(c("g","d",A[!A%in%c("g","d")]),A),]
)

你会看到

  A B  C D
2 g 5  2 2
3 d 7 65 7
1 a 4  2 2
4 e 3  6 7