2015-09-18 152 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))), ]