我有以下数据集。我想按第二栏排序。
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 :(得分: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 :(得分: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))), ]