按列名对数据框的列进行排序

Joh*_*ark 76 sorting r dataset

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

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
Run Code Online (Sandbox Code Playgroud)

我喜欢按字母顺序按列名排序,以实现

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8
Run Code Online (Sandbox Code Playgroud)

对于其他人,我想要自己定义的订单:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8
Run Code Online (Sandbox Code Playgroud)

请注意我的数据集很大,有10000个变量.因此,该过程需要更加自动化.

Jam*_*mes 117

您可以使用ordernames,并用它来定购子集化时的列:

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
Run Code Online (Sandbox Code Playgroud)

对于您自己定义的顺序,您需要定义自己的名称映射到排序.这取决于你想如何做到这一点,但交换上面的任何功能order应该给你想要的输出.

例如,您可以查看根据指定所需顺序的目标向量对数据框的行进行排序,即您match的数据框可以names针对包含所需列顺序的目标向量.

  • 详细说来,测试[,c(2,3,1)]或测试[,c('A','B','C')]将产生A,B,C列顺序."["操作员非常聪明地弄清楚你想做什么. (3认同)
  • 谢谢,我在提供帮助时想出了第二个问题; myorder = c("B","A","C"),test [,myorder] (2认同)

And*_*ēza 17

这是必须的dplyr答案,如果有人想用管道这样做.

test %>% 
    select(sort(names(.)))
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这很有效,因为很容易先选择想要的变量。坚持原始df:`test%>%select(b,sort(names(。)))`会将其设置为“ b,a,c” (2认同)

小智 13

test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))
Run Code Online (Sandbox Code Playgroud)

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

test <- test[, c("A", "B", "C")]
Run Code Online (Sandbox Code Playgroud)

为他人:

test <- test[, c("B", "A", "C")]
Run Code Online (Sandbox Code Playgroud)


Sha*_*wal 7

  test[,sort(names(test))]
Run Code Online (Sandbox Code Playgroud)

对列名进行排序可以很容易地工作。


小智 6

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

require(dplyr)
test %>%
  select(B, everything())
Run Code Online (Sandbox Code Playgroud)


dem*_*ain 5

另一种选择是使用str_sort()from library stringr和参数numeric = TRUE。这将正确排序包含数字的列,而不仅仅是按字母顺序排列

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

# [1] V1 V3 V11