【问题标题】:How to control the order of a variable mixed with string and numbers in R [duplicate]如何控制与R中的字符串和数字混合的变量的顺序[重复]
【发布时间】:2019-06-13 22:37:15
【问题描述】:

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

【问题讨论】:

  • 我看到了帖子,但我认为它们是不同的问题。
  • df[gtools::mixedorder(df$x),] 似乎工作正常。另外,如果你有类似S01 的东西会怎样?在这种情况下,接受的nchar 答案可能会失败

标签: r


【解决方案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

【讨论】:

  • @DavidZ 只要确保没有空格。
【解决方案2】:

您可以使用 gtools 包中的 mixedorder() 函数轻松完成此操作。

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:15 并且 x 排序为 S1、S10、S2。它不起作用。
  • 为什么不呢?行名与您的排序有什么关系? mixedorder 的作用是从字符串中去除数字并对这些数字进行排序。
  • 你可以试试我生成的df(以arrange()结尾)
  • 这似乎工作df[gtools::mixedorder(df$x),]
  • @DavidZ 您需要将slice() 与mixedorder() 一起使用,而不是arrange()。所以 - df %&gt;% slice(gtools::mixedorder(x)) 给出了想要的结果。
【解决方案3】:

您也可以在数据框中添加一个纯数字序列列并按此排序。然后,只需确定您实际想要查看的列的范围:

df<-data.frame(ord=c(1:15), x=paste0("S", 1:15), y=letters[1:15], stringsAsFactors=FALSE)
df[order(ord), c("x", "y")]

【讨论】:

    【解决方案4】:

    为什么不这样?

    df[order(nchar(df$x),df$x),]

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 2020-04-27
      • 1970-01-01
      • 2016-05-07
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多