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

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

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个变量。所以这个过程需要更加自动化。

194935 次浏览

您可以在 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将任何函数交换到此操作应该会得到所需的输出。

例如,您可以查看 根据指定所需顺序的目标向量对数据帧的行进行排序,也就是说,您可以根据包含所需列顺序的目标向量 match数据帧 names

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")]

下面是我在我的数据集中发现的类似问题。

首先,做詹姆斯上面提到的事情。

test[ , order(names(test))]

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

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

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

  test[,sort(names(test))]

对列名进行排序很容易。

这是必须的 dplyr答案,以防有人想用管子做这个。

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

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

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

Similar to other syntax above but for learning - can you sort by column names?

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

An alternative option is to use str_sort() from library Stringr, with the argument numeric = TRUE. This will correctly order column that include numbers not just alphabetically:

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

# [1] V1 V3 V10

因此,为了让一个特定的栏目排在第一位,然后是按字母顺序排列的其他栏目,我建议这样解决:

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

另一个选择是. 。

mtcars %>% dplyr::select(order(names(mtcars)))

data.table中,你可以使用函数 setcolorder:

Setcolorder 通过引用将 data.table 的列重新排序到 new order provided.

这里有一个可重复的例子:

library(data.table)
test = data.table(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))
setcolorder(test, c(order(names(test))))
test
#>    A B C
#> 1: 4 1 0
#> 2: 2 3 2
#> 3: 4 8 4
#> 4: 7 3 7
#> 5: 8 2 8

Created on 2022-07-10 by the Reprex 软件包 (v2.0.1)