使用 dplyr 按自定义顺序排列行
Arranging rows in custom order using dplyr
利用dplyr
中的arrange
函数,我们可以按升序或降序排列行。想知道如何按自定义顺序排列行。请参阅 MWE。
Reg <- rep(LETTERS[1:3], each = 2)
Res <- rep(c("Urban", "Rural"), times = 3)
set.seed(12345)
Pop <- rpois(n = 6, lambda = 500000)
df <- data.frame(Reg, Res, Pop)
df
Reg Res Pop
1 A Urban 500414
2 A Rural 500501
3 B Urban 499922
4 B Rural 500016
5 C Urban 501638
6 C Rural 499274
df %>%
arrange()
期望输出
Reg Res Pop
5 C Urban 501638
6 C Rural 499274
1 A Urban 500414
2 A Rural 500501
3 B Urban 499922
4 B Rural 500016
我们可以使用 factor
以自定义方式更改 order
df %>%
arrange(factor(Reg, levels = LETTERS[c(3, 1, 2)]), desc(Res), desc(Pop))
# Reg Res Pop
#1 C Urban 501638
#2 C Rural 499274
#3 A Urban 500414
#4 A Rural 500501
#5 B Urban 499922
#6 B Rural 500016
或使用 match
获取索引并在其上 arrange
df %>%
arrange(match(Reg, c("C", "A", "B")), desc(Res), desc(Pop))
如果我们有多个列以arrange
降序排列
df %>%
arrange_at(2:3, desc) %>%
arrange(match(Reg, c("C", "A", "B")))
使用data.table
df1[order(factor(Reg,levels = LETTERS[c(3,1,2)]))]
这里df1是data.table
我使用了 slice() 函数:
df %<>%
slice(5,6,1:4)
对于上面选择的答案,%in%
可以作为替代匹配。
%in%
作为二元运算符是一个更直观的界面,returns 一个逻辑向量,指示其左操作数是否匹配。
用法
match(x, table, nomatch = NA_integer_, incomparables = NULL)
x %in% table
利用dplyr
中的arrange
函数,我们可以按升序或降序排列行。想知道如何按自定义顺序排列行。请参阅 MWE。
Reg <- rep(LETTERS[1:3], each = 2)
Res <- rep(c("Urban", "Rural"), times = 3)
set.seed(12345)
Pop <- rpois(n = 6, lambda = 500000)
df <- data.frame(Reg, Res, Pop)
df
Reg Res Pop
1 A Urban 500414
2 A Rural 500501
3 B Urban 499922
4 B Rural 500016
5 C Urban 501638
6 C Rural 499274
df %>%
arrange()
期望输出
Reg Res Pop
5 C Urban 501638
6 C Rural 499274
1 A Urban 500414
2 A Rural 500501
3 B Urban 499922
4 B Rural 500016
我们可以使用 factor
以自定义方式更改 order
df %>%
arrange(factor(Reg, levels = LETTERS[c(3, 1, 2)]), desc(Res), desc(Pop))
# Reg Res Pop
#1 C Urban 501638
#2 C Rural 499274
#3 A Urban 500414
#4 A Rural 500501
#5 B Urban 499922
#6 B Rural 500016
或使用 match
获取索引并在其上 arrange
df %>%
arrange(match(Reg, c("C", "A", "B")), desc(Res), desc(Pop))
如果我们有多个列以arrange
降序排列
df %>%
arrange_at(2:3, desc) %>%
arrange(match(Reg, c("C", "A", "B")))
使用data.table
df1[order(factor(Reg,levels = LETTERS[c(3,1,2)]))]
这里df1是data.table
我使用了 slice() 函数:
df %<>%
slice(5,6,1:4)
对于上面选择的答案,%in%
可以作为替代匹配。
%in%
作为二元运算符是一个更直观的界面,returns 一个逻辑向量,指示其左操作数是否匹配。
用法
match(x, table, nomatch = NA_integer_, incomparables = NULL)
x %in% table