2015-09-18 2 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 самом деле не сортируется в соответствии со значением числа. Я переписать данные, поставив дополнительные 00 и 0 (вручную), как следующее:

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 (включая 00 и 0).

+0

Он заказывает столбцы по порядку аргументов, 'LFrom' первым, а затем' ID'. Похоже, он работает нормально. Не уверен, что вы просите. –

+0

Является ли идентификатор последовательным форматом, который вы знаете заранее? т.е. набор значений символов с помощью набора числовых значений. – 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))), ] 
Смежные вопросы