Skip to content
Back to formatted view

Raw Message

Message-ID: <CAF8bMcaMQQQMDKtOGJVVi6x_yCsDXjK1mxKvC_B0nRxh+KS03g@mail.gmail.com>
Date: 2018-12-04T20:02:48Z
From: William Dunlap
Subject: order(decreasing=c(TRUE,FALSE),...)

The NEWS file for R-devel (as of  2018-11-28 r75702) says

 ? order(...., decreasing=c(TRUE,FALSE)) could fail in some cases.
    Reported from StackOverflow via Karl Nordstr?m.

However, either I don't understand the meaning of decreasing=c(TRUE,FALSE)
or there are still problems.  I thought order(x,y,decreasing=c(TRUE,FALSE)
meant to return indices, i, such that x[i] was non-increasing and that ties
among the x's would be broken by y in non-decreasing order.  E.g., that
interpretation works for numeric vectors:
  > d <- data.frame(X=c(2,1,2,1,2,2,1), N=c(4:7,1:3))
  > d[order(d$X, d$N, decreasing=c(TRUE, FALSE)), ] # expect decreasing X
and, within group of tied Xes, increasing N
    X N
  5 2 1
  6 2 2
  1 2 4
  3 2 6
  7 1 3
  2 1 5
  4 1 7
But it fails for character vectors:  E.g., add some of those that have the
same sort order as 'N':

  > d$Char <- LETTERS[d$N]
  > identical(order(d$N), order(d$Char)) # expect TRUE
  [1] TRUE

I expected the new columns to give the same sort order when they replace
'd$N' in the first call to order, but they do not:  It acts like it would
with decreasing=c(TRUE,TRUE).

  > order(d$X, d$Char, decreasing=c(TRUE, FALSE))
  [1] 3 1 6 5 4 2 7
  > d[order(d$X, d$Char, decreasing=c(TRUE, FALSE)), ]
    X N Char
  3 2 6    F
  1 2 4    D
  6 2 2    B
  5 2 1    A
  4 1 7    G
  2 1 5    E
  7 1 3    C

Bill Dunlap
TIBCO Software
wdunlap tibco.com

	[[alternative HTML version deleted]]