假设我有一个data.frame df
library(tidyverse)
df<-data.frame(x=paste0("S", 1:15), y=letters[1:15], stringsAsFactors=F)%>%
arrange(x)
x y
1 S1 a
2 S10 j
3 S11 k
4 S12 l
5 S13 m
6 S14 n
7 S15 o
8 S2 b
9 S3 c
10 S4 d
11 S5 e
12 S6 f
13 S7 g
14 S8 h
15 S9 i
如何将x
安排为输出,例如:
x y
1 S1 a
2 S2 b
3 S3 c
4 S4 d
5 S5 e
6 S6 f
7 S7 g
8 S8 h
9 S9 i
10 S10 j
11 S11 k
12 S12 l
13 S13 m
14 S14 n
15 S15 o
答案 0 :(得分:1)
您可以使用mixedorder()
软件包中的gtools
函数来轻松完成此操作。
library(gtools)
df<-data.frame(x=paste0("S", 1:15 ), y=letters[1:15], stringsAsFactors=F)
# mix it up
set.seed(121)
df <- df[sample(row.names(df), nrow(df)),]
# reorder it
df[mixedorder(df$x),]
是这样的:
x y
6 S6 f
3 S3 c
2 S2 b
15 S15 o
5 S5 e
12 S12 l
9 S9 i
10 S10 j
11 S11 k
8 S8 h
7 S7 g
1 S1 a
14 S14 n
13 S13 m
4 S4 d
对此
x y
1 S1 a
2 S2 b
3 S3 c
4 S4 d
5 S5 e
6 S6 f
7 S7 g
8 S8 h
9 S9 i
10 S10 j
11 S11 k
12 S12 l
13 S13 m
14 S14 n
15 S15 o
在tidyverse中,您可以执行此操作-
df %>%
slice(mixedorder(x))
答案 1 :(得分:1)
这是dplyr
中的一种可能方法-
df %>%
arrange(nchar(x), x)
x y
1 S1 a
2 S2 b
3 S3 c
4 S4 d
5 S5 e
6 S6 f
7 S7 g
8 S8 h
9 S9 i
10 S10 j
11 S11 k
12 S12 l
13 S13 m
14 S14 n
15 S15 o
答案 2 :(得分:0)
好吧,您还可以在数据框中添加一个纯数字序列列,并以此进行排序。然后,只需将您实际想要查看的列范围:
df<-data.frame(ord=c(1:15), x=paste0("S", 1:15), y=letters[1:15], stringsAsFactors=FALSE)
df[order(ord), c("x", "y")]
答案 3 :(得分:0)
为什么不呢?
df[order(nchar(df$x),df$x),]