我有一个如下所示的data.frame:
有1000多个列名相同的列。
我有一个这样的列名的向量,如下所示:
向量按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
有快速的方法吗?
答案 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
如果有人遇到问题,我希望这可以提供另一个解决方案!