R:通过列名矢量对数据帧的列进行排序

时间:2014-04-17 19:27:03

标签: r sorting vector dataframe

我有一个如下所示的data.frame: enter image description here

有1000多个列名相同的列。

我有一个这样的列名的向量,如下所示: enter image description here

向量按cluster_id排序(最多为11)。

我想对数据框中的列进行排序,使列按照向量中的名称顺序排列。

我想要的一个简单例子是:

数据:

 A    B    C
 1    2    3
 4    5    6

矢量: C( “B”, “C”, “A”)

排序

 B    C    A
 2    3    1
 5    6    4

有快速的方法吗?

3 个答案:

答案 0 :(得分:11)

UPDATE,由OP添加可重现的数据:

df <- read.table(h=T, text="A    B    C
    1    2    3
    4    5    6")
vec <- c("B", "C", "A")
df[vec]

结果:

  B C A
1 2 3 1
2 5 6 4

OP愿望。


怎么样:

df[df.clust$mutation_id]

其中df是您想要对df.clust列进行排序的data.frame,是包含具有列顺序(mutation_id)的向量的数据框。

这基本上将df视为列表,并使用标准向量索引技术对其进行重新排序。

答案 1 :(得分:9)

布罗迪的回答完全符合你的要求。但是,您暗示您的数据很大,因此我将使用“data.table”提供替代方案,该方法具有名为setcolorder的函数,该函数将通过引用更改列顺序。

这是一个可重复的例子。

从一些简单的数据开始:

mydf <- data.frame(A = 1:2, B = 3:4, C = 5:6)
matches <- data.frame(X = 1:3, Y = c("C", "A", "B"), Z = 4:6)
mydf
#   A B C
# 1 1 3 5
# 2 2 4 6
matches
#   X Y Z
# 1 1 C 4
# 2 2 A 5
# 3 3 B 6

提供Brodie答案的证据:

out <- mydf[matches$Y]
out
#   C A B
# 1 5 1 3
# 2 6 2 4

显示更有效的内存方式来做同样的事情。

library(data.table)
setDT(mydf)
mydf
#    A B C
# 1: 1 3 5
# 2: 2 4 6

setcolorder(mydf, as.character(matches$Y))
mydf
#    C A B
# 1: 5 1 3
# 2: 6 2 4

答案 2 :(得分:0)

A5C1D2H2I1M1N2O1R2T1的解决方案不适用于我的数据(我有一个与张伊伦类似的问题),所以我找到了另一个选择:

mydf <- data.frame(A = 1:2, B = 3:4, C = 5:6)
#   A B C
# 1 1 3 5
# 2 2 4 6
matches <- c("B", "C", "A") #desired order

mydf_reorder <- mydf[,match(matches, colnames(mydf))]
colnames(mydf_reorder)
#[1] "B" "C" "A"

match()找到第一个元素在第二个元素上的位置:

match(matches, colnames(mydf))
#[1] 2 3 1

如果有人遇到问题,我希望这可以提供另一个解决方案!