【问题标题】:Is there an R function to sort column variables?是否有 R 函数对列变量进行排序?
【发布时间】:2019-10-05 22:11:23
【问题描述】:

是否有用于对列变量进行排序的 R 函数?我有如下列的列表

Col1    11  110   1100    12
   a    1   2     20      22
   b    16  5      3      18

默认情况下,R 对 11、110、1100 等进行排序。

但我需要,

Col1    11  12    110   1100    
   a    1   22     2    20  
   b    16  18     5    3   

有没有办法做到这一点?

【问题讨论】:

  • 你试过sortorder吗?
  • 您不应该将整数作为列名,因为它们不是真正的整数,而是字符。因此,通常的排序会产生不希望的结果,并且使用此列名进行数据操作也会使其变得困难和混乱。
  • 我试过了,但还是一样
  • 要添加到@DavidArenburg 的评论中,R 几乎总是会在数字列名称中添加一个 X。麻烦的是,即使您删除了这个 X,col1 的存在也使得这些名称很难排序。 dplyrs selecteverything 结合使用可能会更容易。
  • 你不了解我。列名永远不是整数,即使它们是这样打印的。因此,它们将按字符进行排序,因此“110”将排在“12”之前,因此您的排序没有多大意义。您可以使用一些辅助函数来实现这一点,例如df[c("Col1", gtools::mixedsort(names(df)[-1]))]。但是,使用这样的列名仍然不是一个好习惯。

标签: r


【解决方案1】:

如果您只有 Col1 作为非数字,您可以使用:

df[,c("Col1",as.character(sort(as.numeric(names(df)[-1]),decreasing=F)))]
  Col1 11 12 110 1100
1    a  1 22   2   20
2    b 16 18   5    3

否则:

要添加到@DavidArenburg 的评论,R 几乎总是会在数字列名称中添加一个 X。麻烦的是,即使您删除了这个 X,col1 的存在也使得这些名称很难排序。 dplyrselecteverything 结合使用可能会更容易,如下所示。

df<-read.table(text="Col1    11  110   1100    12
   a    1   2     20      22
   b    16  5      3      18",header=T)

names(df) <- gsub("X","",names(df))

正如@akrun 指出的那样,我们可以通过在read.table 中设置check.names=FALSE 来跳过gsub,即:

 df<-read.table(text="Col1    11  110   1100    12
       a    1   2     20      22
       b    16  5      3      18",header=T, check.names= FALSE)

继续dplyr

 library(dplyr)
    df %>% 
      select(Col1,`11`,`12`,everything())
      Col1 11 12 110 1100
    1    a  1 22   2   20
    2    b 16 18   5    3

【讨论】:

  • 你好尼尔森。我知道了谢谢。这里只有 11 和 12。但我只给出了列的示例。在 mu 数据集中,有很多列,例如 11,110,1100.......................12,120,1200............ ............13,130,1300 等等。
  • 请尝试这个答案的第一部分。
  • 我确实试过了。但是我在 19 之后得到 110,而不是 20。但是我得到 11、12、13 等等。但是在 19 之后,它是 110。我需要 20、21 等等
  • 你能用dput(head(df))将你的数据添加到问题中吗?
  • 谢谢@akrun 我会牢记这一点。
【解决方案2】:

使用基本 R 的解决方法可能是:

df <- read.table(text = "Col1    11  110   1100    12
a    1   2     20      22
b    16  5      3      18", h = T)

colnames(df)[-1] <- gsub("\\D", "", colnames(df)[-1]) #this step is not necessary if your data does not contain X'es in thecolumn names

df[,c(colnames(df)[1],as.character(sort(as.numeric(colnames(df)[-1]))))]

  Col1 11 12 110 1100
1    a  1 22   2   20
2    b 16 18   5    3

不过,我还是建议考虑 @David Arenburg 和 @NelsonGon 的担忧。

【讨论】:

    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2023-01-17
    • 2014-06-02
    • 2020-11-03
    • 2011-05-16
    相关资源
    最近更新 更多