vinodetrx
vinodetrx

Reputation: 142

How to sort odd and even numbers of an array in a specific format

I have a vector like this

seq_vector <- c(3,12,5,9,11,8,4,6,7,11,15,3,9,10,12,2)

I want to format them in descending order of odd numbers, followed by ascending order of even numbers. Output of above seq_vector will be

new_seq_vector <- c(15,11,11,9,9,7,5,3,3,2,4,6,8,10,12,12)

Can you please help me with the logic of the same?

Upvotes: 2

Views: 716

Answers (3)

Frank
Frank

Reputation: 66819

Try x[order(x*v)] where v is -1 for odd, +1 for even.

Thanks to @lmo for this:

x[order( x*(-1)^x )]
# [1] 15 11 11  9  9  7  5  3  3  2  4  6  8 10 12 12

So v = (-1)^x here.


Some other ways to build v: @d.b's (-1)^(x %% 2); and mine, 1-2*(x %% 2).

(Thanks @d.b) If x contains negative integers, an additional sorting vector is needed:

# new example
x = c(2, 5, -15, -10, 1, -3, 12)
x[order(v <- (-1)^x, x*v)]
# [1]   5   1  -3 -15 -10   2  12

Upvotes: 6

Rui Barradas
Rui Barradas

Reputation: 76470

Use an auxiliary function.

is.odd <- function(x) (x %% 2) == 1

result <- c(sort(seq_vector[is.odd(seq_vector)], decreasing = TRUE),
            sort(seq_vector[!is.odd(seq_vector)]))
result

Upvotes: 2

d.b
d.b

Reputation: 32548

Take modulus by 2 (%% 2) to determine the odd and even elements and sort accordingly.

c(sort(seq_vector[seq_vector %% 2 == 1], decreasing = TRUE),             #For odd
                               sort(seq_vector[seq_vector %% 2 == 0]))   #For even
 #[1] 15 11 11  9  9  7  5  3  3  2  4  6  8 10 12 12

Upvotes: 3

Related Questions