如何将两个特定行移动到数据框的顶部?
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
并在 arrange
ing
之前的订单中指定 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
下面我有一个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
并在 arrange
ing
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