这是关于订购包含数字和文本的列名。我有一个由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?
中获取列的最简单方法是什么?非常感谢!
答案 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}},Testname2
和Testname10
会以正确的顺序出现。
答案 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"