2015-09-18 119 views
1

我有以下数据集。我想按第二栏排序。按数据中的列进行排序

dat <- read.table(header=TRUE, text=" 
        ID LFrom LTo It1 It2 It3 It4 
        ab7 1 2 47 152 259 140 
        ab8 1.1 2.1 88 236 251 145 
        ab21 1.2 2.1 72 263 331 147 
        ab3 1 2 71 207 290 242 
        ab300 1 2 47 152 259 140 
        ab4 1.2 2.1 72 263 331 147 
        ab10 1.1 2 71 207 290 242 
        ab501 1 2 47 152 259 140 
        ") 

dat 
    ID LFrom LTo It1 It2 It3 It4 
1 ab7 1.0 2.0 47 152 259 140 
2 ab8 1.1 2.1 88 236 251 145 
3 ab21 1.2 2.1 72 263 331 147 
4 ab3 1.0 2.0 71 207 290 242 
5 ab300 1.0 2.0 47 152 259 140 
6 ab4 1.2 2.1 72 263 331 147 
7 ab10 1.1 2.0 71 207 290 242 
8 ab501 1.0 2.0 47 152 259 140 

通过使用下面的代码,我发现:

dat[with(dat, order(LFrom, ID)),] 
    ID LFrom LTo It1 It2 It3 It4 
4 ab3 1.0 2.0 71 207 290 242 
5 ab300 1.0 2.0 47 152 259 140 
8 ab501 1.0 2.0 47 152 259 140 
1 ab7 1.0 2.0 47 152 259 140 
7 ab10 1.1 2.0 71 207 290 242 
2 ab8 1.1 2.1 88 236 251 145 
3 ab21 1.2 2.1 72 263 331 147 
6 ab4 1.2 2.1 72 263 331 147 

ID排序是没有根据的数值真的来分类的。我通过把多余的000(手动),如下面的重写数据:

dat1 <- read.table(header=TRUE, text=" 
        ID LFrom LTo It1 It2 It3 It4 
        ab007 1 2 47 152 259 140 
        ab008 1.1 2.1 88 236 251 145 
        ab021 1.2 2.1 72 263 331 147 
        ab003 1 2 71 207 290 242 
        ab300 1 2 47 152 259 140 
        ab004 1.2 2.1 72 263 331 147 
        ab010 1.1 2 71 207 290 242 
        ab501 1 2 47 152 259 140 
        ") 
dat1 
    ID LFrom LTo It1 It2 It3 It4 
1 ab007 1.0 2.0 47 152 259 140 
2 ab008 1.1 2.1 88 236 251 145 
3 ab021 1.2 2.1 72 263 331 147 
4 ab003 1.0 2.0 71 207 290 242 
5 ab300 1.0 2.0 47 152 259 140 
6 ab004 1.2 2.1 72 263 331 147 
7 ab010 1.1 2.0 71 207 290 242 
8 ab501 1.0 2.0 47 152 259 140 

现在下面的代码工作正常:

dat1[with(dat1, order(LFrom, ID)), ] 
    ID LFrom LTo It1 It2 It3 It4 
4 ab003 1.0 2.0 71 207 290 242 
1 ab007 1.0 2.0 47 152 259 140 
5 ab300 1.0 2.0 47 152 259 140 
8 ab501 1.0 2.0 47 152 259 140 
2 ab008 1.1 2.1 88 236 251 145 
7 ab010 1.1 2.0 71 207 290 242 
6 ab004 1.2 2.1 72 263 331 147 
3 ab021 1.2 2.1 72 263 331 147 

我有数据集的大名单。手动更改ID非常困难。我需要的所有ID排序(包括000)。

+0

它通过的参数的顺序第一笔订单列,'LFrom',然后'ID'。它看起来像工作正常。不确定你在问什么。 –

+0

ID是否遵循您事先知道的一致格式?即一组字符值由一组数值组成。 – misspelled

+0

@mispelled,ID的数值是3位数(最大值),它在开始时具有一致的形式为“ab”。 –

回答

3

您可以用substr组合改变及sprintf如下:

dat$ID <- paste0(substr(dat$ID,1,2),sprintf("%03d",as.numeric(substr(dat$ID,3,5)))) 

这给:

> dat[with(dat, order(LFrom, ID)), ] 
    ID LFrom LTo It1 It2 It3 It4 
4 ab003 1.0 2.0 71 207 290 242 
1 ab007 1.0 2.0 47 152 259 140 
5 ab300 1.0 2.0 47 152 259 140 
8 ab501 1.0 2.0 47 152 259 140 
2 ab008 1.1 2.1 88 236 251 145 
7 ab010 1.1 2.0 71 207 290 242 
6 ab004 1.2 2.1 72 263 331 147 
3 ab021 1.2 2.1 72 263 331 147 
1

使用data.table:

library(data.table) 

dat <- read.table(header=TRUE, text=" 
       ID LFrom LTo It1 It2 It3 It4 
        ab7 1 2 47 152 259 140 
        ab8 1.1 2.1 88 236 251 145 
        ab21 1.2 2.1 72 263 331 147 
        ab3 1 2 71 207 290 242 
        ab300 1 2 47 152 259 140 
        ab4 1.2 2.1 72 263 331 147 
        ab10 1.1 2 71 207 290 242 
        ab501 1 2 47 152 259 140 
        ") 
DT = as.data.table(dat1) 

DT[, newID:=gsub("ab", "", ID)] 
    DT[order(LFrom, newID),] 
     ID LFrom LTo It1 It2 It3 It4 newID 
1: ab003 1.0 2.0 71 207 290 242 003 
2: ab007 1.0 2.0 47 152 259 140 007 
3: ab300 1.0 2.0 47 152 259 140 300 
4: ab501 1.0 2.0 47 152 259 140 501 
5: ab008 1.1 2.1 88 236 251 145 008 
6: ab010 1.1 2.0 71 207 290 242 010 
7: ab004 1.2 2.1 72 263 331 147 004 
8: ab021 1.2 2.1 72 263 331 147 021 

或者只是

library(data.table) 
DT = as.data.table(dat1) 
DT[order(LFrom, gsub("ab", "", ID)),] 

没有data.table这将是:

dat1[with(dat1, order(LFrom, gsub("ab", "", ID))), ]