R:从数字输出重新排序dcast列而不是按字典顺序排列

时间:2014-12-10 23:24:42

标签: r plyr

这是关于订购包含数字和文本的列名。我有一个由dcast产生的数据帧,有200行。我的订购有问题。

列名称采用以下格式:

names(DF) <- c('Testname1.1', 'Testname1.100','Testname1.11','Testname1.2',...,Testname2.99)

编辑:我希望将列排序为:

names(DF) <- c('Testname1.1, Testname1.2,Testname1.3,...Testname1.100,Testname2.1,...Testname 2.100)

原始输入有一个列,用于指定日期,但在我投出的时候没有使用它。数据。有没有办法指定&#39; dcast&#39;函数以数字方式命令组合列名?

根据我需要在R?

中获取列的最简单方法是什么?

非常感谢!

3 个答案:

答案 0 :(得分:3)

我认为您需要拆分列才能使用它来订购数据框:

library("reshape2")  ## for colsplit()
library("gtools")

构建测试数据:

dat <- data.frame(matrix(1:25,5))
names(dat) <- c('Testname1.1', 'Testname1.100',
     'Testname1.11','Testname1.2','Testname2.99')

拆分并订购:

cdat <- colsplit(names(dat),"\\.",c("name","num"))
dat[,order(mixedorder(cdat$name),cdat$num)]

##   Testname1.1 Testname1.2 Testname1.11 Testname1.100 Testname2.99
## 1           1          16           11             6           21
## 2           2          17           12             7           22
## 3           3          18           13             8           23
## 4           4          19           14             9           24
## 5           5          20           15            10           25

上面的mixedorder()(借用@BondedDust的答案)对于这个例子来说并不是必需的,但如果第一个(Testnamexx)组件有超过9个元素,则需要Testname1,所以{{ 1}},Testname2Testname10会以正确的顺序出现。

答案 1 :(得分:3)

pkg:gtools的mixedorder和mixedsort函数有时可以满足要求,但在这种情况下,我认为句点分隔符会弄乱,因为它是数值的一部分。但显然意图是分隔符而不是小数点。试试

    nvec <- c('Testname1.1', 'Testname1.100', 'Testname1.11', 'Testname1.2', 'Testname2.99')
#------------
> require(gtools)
Loading required package: gtools

Attaching package: ‘gtools’

The following objects are masked from ‘package:boot’:

    inv.logit, logit
#------------
myvec <- nvec[order( mixedorder( sapply(strsplit(nvec, "\\."), "[[", 1)),
                  as.numeric(sapply(strsplit(nvec, "\\."), "[[", 2))  )
              ]

答案 2 :(得分:1)

一种方法是:

library(gtools) #use gtools library
library(NCmisc) #use NCmisc library for pad.left()

myvec <- c('Testname1.1', 'Testname1.100','Testname1.11','Testname1.2','Testname2.99') #construct your vector

myvec[mixedorder(  paste(substring(myvec,1,9), pad.left(substring(myvec,11,100),'0') , sep='')  ) ] 

[1] "Testname1.1"   "Testname1.2"   "Testname1.11"  "Testname1.100" "Testname2.99"