【问题标题】:Sort data frame by numbers [duplicate]按数字对数据框进行排序[重复]
【发布时间】:2016-08-21 02:02:15
【问题描述】:

我有一个大约 40 列 2000 行的数据框。其中一个有这样的数字和字母:

CLN

5T
14S
1A
12N

起初我使用melt 来获取我的数据的长结构。我想在 y 轴上用 CLN 绘制我的数据,但数字的顺序如下:1A、5T、12N、14S。我知道我必须使用sort,但我怎样才能为我的数字和字母做到这一点? (我很抱歉,但我的 df 很大,我无法提供一个富有成效的例子)。

【问题讨论】:

  • 你的帖子说how can I do this for my numbers only and not the letters?你能澄清一下吗?
  • 是的,对不起。我想根据数字进行排序,但我不想删除字母,因为对于我的情节,我希望顺序如下:1A、1T、1N、1S...3A、3T、3N、3S。这是一个巨大的 df,所以字母和数字之间有很多组合,我需要对两者进行排序,但首先要基于数字。
  • 好的,我的解决方案是不删除任何字母,而是根据字母保持不变的数字排序
  • 好的,那么您的帖子具有误导性,即how can I do this for my numbers only and not the letters?
  • 天哪,头部游戏来了。

标签: r sorting dataframe


【解决方案1】:

gtools 尝试mixedsort

vec <- c("5T", "14S", "1A", "12N")

gtools::mixedsort(vec)
# [1] "1A"  "5T"  "12N" "14S"

【讨论】:

  • 正如我所说,我的 df 很大,因此创建包含所有组合的向量非常困难。
  • @g.f.l 它也适用于列。
  • @mtoto 你是对的,我试过了,它奏效了。谢谢!
【解决方案2】:

如果我们需要通过数字sort,一种方法是使用sub 删除非数字部分,转换为numericorder 列。 OP的帖子说

我怎样才能只为我的数字而不是字母?

v1 <- as.numeric(sub("\\D+", "", df1$CLN))
df1$CLN <- df1$CLN[order(v1)]
df1$CLN
#[1] "1A"  "5T"  "12N" "14S"

如果我们需要对字母和数字都这样做

v2 <- sub("\\d+", "", df1$CLN)
df1$CLN <- df1$CLN[order(v1, v2)]
 

然后,我们将其更改为factor,并将levels 指定为“CLN”的unique 元素,以便在plot 中使用该顺序。

df1$CLN <- factor(df1$CLN, levels = unique(df1$CLN))

注意:这些是base R 选项,没有使用任何包。

数据

df1 <- data.frame(CLN = c("5T", "14S", "1A", "12N"), stringsAsFactors=FALSE)

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多