【发布时间】:2016-09-14 17:40:34
【问题描述】:
我想重新排序我的数据框中的列,但到目前为止我发现的结果并不令人满意。
我的数据框看起来像:
cnt <-as.factor(c("Country 1", "Country 2", "Country 3", "Country 1", "Country 2", "Country 3" ))
bnk <-as.factor(c("bank 1", "bank 2", "bank 3", "bank 1", "bank 2", "bank 3" ))
mayData <-data.frame(age=c(10,12,13,10,11,15), Country=cnt, Bank=bnk, q10=c(1,1,1,2,2,2),q11=c(1,1,1,2,2,2), q1=c(1,1,1,2,2,2), q9=c(1,1,1,2,2,2), q6=c(1,1,1,2,2,2), year=c(1950,1960,1970,1980,1990,2000) )
age Country Bank q10 q11 q1 q9 q6 year
1 10 Country 1 bank 1 1 1 1 1 1 1950
2 12 Country 2 bank 2 1 1 1 1 1 1960
3 13 Country 3 bank 3 1 1 1 1 1 1970
4 10 Country 1 bank 1 2 2 2 2 2 1980
5 11 Country 2 bank 2 2 2 2 2 2 1990
6 15 Country 3 bank 3 2 2 2 2 2 2000
但我想重新排列列,如下所示:
Country Bank year age q1 q6 q9 q10 q11
1 Country 1 bank 1 1950 10 1 1 1 1 1
2 Country 2 bank 2 1960 12 1 1 1 1 1
3 Country 3 bank 3 1970 13 1 1 1 1 1
4 Country 1 bank 1 1980 10 2 2 2 2 2
5 Country 2 bank 2 1990 11 2 2 2 2 2
6 Country 3 bank 3 2000 15 2 2 2 2 2
我的真实数据框有很多列,因此使用索引或每列的名称“手动”重新排列列顺序并不是最佳选择。
还要注意,对于以qs 开头的列名,我希望它们按升序排列,即从q1 到q11。问题是 R 无法理解 q6(代表“问题 6”)应该在 q10 之前。要查看此缺陷,请查看以下示例:
mayData<-mayData[,order(colnames(mayData),decreasing=F)]
age Bank Country q1 q10 q11 q6 q9 year
1 10 bank 1 Country 1 1 1 1 1 1 1950
2 12 bank 2 Country 2 1 1 1 1 1 1960
3 13 bank 3 Country 3 1 1 1 1 1 1970
4 10 bank 1 Country 1 2 2 2 2 2 1980
5 11 bank 2 Country 2 2 2 2 2 2 1990
6 15 bank 3 Country 3 2 2 2 2 2 2000
因此,基本上我想要重新排序列的方式是首先根据我的偏好以某种灵活的方式对几列进行排序,然后使用递减的排序标准。但是,“合乎逻辑”的一个,R 可以理解以正确排序 qs 的一个。
【问题讨论】:
-
改用
q01、q06和q09。 -
您可以根据
as.numeric(sub("^q", "", colnames(...)))订购您的q..列(并且您可以使用grep("^q", colnames(mayData))之类的内容发现这些列)
标签: r data-manipulation data-cleaning