[R] Sorting
David Winsemius
dwinsemius at comcast.net
Sat Feb 6 20:30:15 CET 2010
On Feb 6, 2010, at 1:21 PM, David Neu wrote:
> Hi,
>
> I have a list of vectors (of varying lengths). I'd like to sort this
> list by applying a function to each pair of vectors in the list and
> returning information to sorting routine that let's it know which one
> is larger.
>
> To solve problems like this in Common Lisp, the sort function accepts
> a function as an argument. The arguments to this function are two
> elements of the list which is being sorted. The writer of the
> function returns t (TRUE in R) when the first argument to the function
> is larger than the second and nil (FALSE in R) otherwise.
>
> I'm wondering if there is some way to accomplish this in R.
>
Here's one way, although there may be options within the netherworld
of S4 methods that I am not smart enough to navigate:
GT <- function(x,y) x > y
x <- c(8,7,4,2,5,7,5,8,4,5,8,3,0)
> sum(GT(x[1],x))
[1] 10 # so the first element is greater than 10 other elements
x[order(rowSums(sapply(x, GT, y=x)) )]
# compare the number of other elements one by one and sort by the
direction of your choice
# [1] 8 8 8 7 7 5 5 5 4 4 3 2 0
#There's probably a method around the "reversal" of the usual sort
order:
> x[order(rowSums(sapply(x, GT, y=x)) ,decreasing=TRUE)]
[1] 0 2 3 4 4 5 5 5 7 7 8 8 8
Perhaps use instead negation of the logical matrix that the sapply
creates:
> x[order(rowSums(!sapply(x, GT, y=x)) )]
[1] 0 2 3 4 4 5 5 5 7 7 8 8 8
> sortFn <- function(x, FUN=">", ...) x[order(rowSums(!sapply(x, GT,
y=x)) , ...)]
> sortFn(x, GT)
[1] 0 2 3 4 4 5 5 5 7 7 8 8 8
> sortFn(x, GT, decreasing=TRUE)
[1] 8 8 8 7 7 5 5 5 4 4 3 2 0
--
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
More information about the R-help
mailing list