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

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to