【问题标题】:Sort columns of a dataframe by column name按列名对数据框的列进行排序
【发布时间】:2011-11-12 04:11:32
【问题描述】:

这可能是一个简单的问题,但我不知道如何按字母顺序排列列。

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

我喜欢按列名的字母顺序对列进行排序,以实现

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

对于其他人,我想要我自己定义的顺序:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

请注意,我的数据集很大,有 10000 个变量。所以这个过程需要更加自动化。

【问题讨论】:

    标签: r sorting dataset


    【解决方案1】:

    您可以在names 上使用order,并在子集时使用它对列进行排序:

    test[ , order(names(test))]
      A B C
    1 4 1 0
    2 2 3 2
    3 4 8 4
    4 7 3 7
    5 8 2 8
    

    对于您自己定义的顺序,您需要定义自己的名称到顺序的映射。这将取决于您希望如何执行此操作,但是将任何函数与上面的order 交换应该会得到您想要的输出。

    例如,您可以查看Order a data frame's rows according to a target vector that specifies the desired order,即您可以match 您的数据框names 针对包含所需列顺序的目标向量。

    【讨论】:

    • 详细来说,test[,c(2,3,1)] 或 test[,c('A','B','C')] 会产生 A,B,C 列命令。 "[" 运算符非常聪明地知道你想做什么。
    • 谢谢,我在提供的帮助下解决了第二个问题; myorder = c("B", "A", "C"), test[,myorder]
    • 有没有办法以我想要的方式对列进行排序(比如 C A B)?
    • 您可以利用 data.frame 是一个列表这一事实并使其更简单:: test[ order(names(test)) ]
    • @naco 无,阅读colnames 的来源:它最终会调用names 以获得data.frame
    【解决方案2】:

    这是强制性的dplyr 答案,以防有人想对管道进行此操作。

    test %>% 
        select(sort(names(.)))
    

    【讨论】:

    • 对我来说这很有效,因为很容易首先选择我想要的变量。坚持原来的df:test%>%select(b,sort(names(.)))会写成"b,a,c"
    【解决方案3】:
    test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))
    

    可以使用以下简单的函数替换(但仅当数据框没有很多列时):

    test <- test[, c("A", "B", "C")]
    

    为他人:

    test <- test[, c("B", "A", "C")]
    

    【讨论】:

      【解决方案4】:

      另一种选择是使用库 stringr 中的 str_sort(),并带有参数 numeric = TRUE。这将正确排序包含数字的列不仅仅是按字母顺序

      str_sort(c("V3", "V1", "V10"), numeric = TRUE)

      # [1] V1 V3 V11

      【讨论】:

        【解决方案5】:
          test[,sort(names(test))]
        

        对列名进行排序很容易。

        【讨论】:

          【解决方案6】:

          如果你只想要前面的一列或多列而不关心其余列的顺序:

          require(dplyr)
          test %>%
            select(B, everything())
          

          【讨论】:

            【解决方案7】:

            所以要先有一个特定的列,然后按字母顺序排列其余列,我会提出这个解决方案:

            test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
            

            【讨论】:

            • 如果您希望多列排在第一位,那该怎么办?
            【解决方案8】:

            类似于上面的其他语法,但用于学习 - 你可以按列名排序吗?

            sort(colnames(test[1:ncol(test)] ))
            

            【讨论】:

            • [1:ncol(test)] 在这里没有做任何事情,只是写sort(colnames(test)) 的方式更长。
            【解决方案9】:

            这是我发现在我的数据集上遇到类似问题的方法。

            首先,做詹姆斯上面提到的,即

            test[ , order(names(test))]
            

            其次,使用 dplyr 中的 Everything() 函数将感兴趣的特定列(例如,“D”、“G”、“K”)移动到数据框的开头,将按字母顺序排列的列放在这些列之后.

            select(test, D, G, K, everything())
            

            【讨论】:

              猜你喜欢
              • 2018-06-25
              • 2018-03-18
              • 2014-06-02
              • 2019-08-31
              • 2010-11-20
              相关资源
              最近更新 更多