sorting a complex vector by imaginary part in R

2019-02-27 16:06发布

问题:

roots <- polyroot(c(5, 4, 3, 2, 1))

I want to sort the roots by ascending order of the imaginary part. By default the sort function sorts it by the increasing order of the real part. I've read the document and I still do not know how to adjust the arguments or write the command. Can anybody help?

回答1:

Use Im function to extract the imaginary part and sort it.

roots <- polyroot(c(5, 4, 3, 2, 1))
#[1]  0.287815+1.416093i -1.287815+0.857897i -1.287815-0.857897i
#[4]  0.287815-1.416093i

roots[order(Im(roots))]
#[1]  0.287815-1.416093i -1.287815-0.857897i -1.287815+0.857897i
#[4]  0.287815+1.416093i


回答2:

This also works:

> roots<-polyroot(c(5,4,3,2,1))
> roots[sort(Im(roots),index.return=T)$ix]
[1]  0.287815-1.416093i -1.287815-0.857897i
[3] -1.287815+0.857897i  0.287815+1.416093i

Sort the complex numbers by their imaginary parts and return their indexes, then use the indexes to refer the corresponding complex value in the sorted order.