如何在R中控制混合了字符串和数字的变量的顺序

时间:2019-06-13 13:37:55

标签: r

假设我有一个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

4 个答案:

答案 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),]