按数据中的列排序

时间:2015-09-18 18:47:42

标签: r sorting

我有以下数据集。我想按第二栏排序。

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)。

2 个答案:

答案 0 :(得分:3)

您可以使用substrsprintf的组合进行更改,如下所示:

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 :(得分: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))), ]