2

Sorting by columns in the data

 3 years ago
source link: https://www.codesd.com/item/sorting-by-columns-in-the-data.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Sorting by columns in the data

advertisements

I have the following dataset. I want to sort it by second column.

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

By using the following code, I find:

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

The sorting in ID is not really sorted according to the number value. I rewrite the data by putting extra 00 and 0 (manually) like the following:

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

Now the following code works fine:

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

I have a large list of dataset. Manually changing the ID is tough. All I need to get the ID sorted (with including 00 and 0).


You can change the with a combination of substr and sprintf as follows:

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

this gives:

> 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

Tags sorting

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK