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


93

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

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个变量。因此,该过程需要更加自动化。

Answers:


137

您可以order在上使用names,并在设置子集时使用该命令对列进行排序:

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上面的功能交换任何功能都将提供所需的输出。

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


3
详细地说,test [,c(2,3,1)]或test [,c('A','B','C')]将产生A,B,C列顺序。“ [”运算符非常聪明,可以弄清楚您想做什么。
卡尔·威索夫特

2
谢谢,我在提供帮助的情况下找到了第二个问题;myorder = c(“ B”,“ A”,“ C”),test [,myorder]
John Clark

有没有一种方法可以按我想要的方式对列进行排序(例如CAB)?
TYZ 2014年

您可以利用data.frame是列表的事实,并使其变得更简单:: test[ order(names(test)) ]
ctbrown

1
@naco无,读之源colnames:它最终调用namesdata.frame
詹姆斯(James)


14
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

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

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

2

因此,要首先有一个特定的列,然后按字母顺序排列其余的列,我建议采用以下解决方案:

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

如果您希望多个列成为第一列,那又如何呢?
Maksym Moroz

2

另一种选择是使用str_sort()来自库stringr的参数numeric = TRUE。这将正确排序包含数字的列,而不仅仅是数字:

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

# [1] V1 V3 V11


1

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

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

[1:ncol(test)]这里什么也没做,只是一种更长的书写方式sort(colnames(test))
格雷戈尔·托马斯

0

这是我发现可以用我的数据集实现类似问题的结果。

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

test[ , order(names(test))]

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

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

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.