Skip to content

Puzzled over "partial"

3 messages · Nick Wray, Andrew Simmons, Richard O'Keefe

#
Hello   I am puzzled about the use or status of "partial" in R.  years ago
I found a little piece of code which gives the pth largest number in a
vector:
x<-c(5,4,7,2,6,9)
n <- length(x)
p<-4
sort(x,partial=n-(n-p))[n-(n-p)]
This works fine, although I have tried playing around with the code and
don't understand what "partial" is doing here.
However, wanted to work out what was going on, so I looked for "partial in
r" on t'internet and got this site:Partial apply a function, filling in
some arguments. ? partial ? purrr (tidyverse.org)
<https://purrr.tidyverse.org/reference/partial.html#:~:text=Source%3A%20R%2Fpartial.R%20Partial%20function%20application%20allows%20you%20to,that%20an%20argument%20can%20only%20be%20partialised%20once.>
Examples:
# Partial is designed to replace the use of anonymous functions for #
filling in function arguments. Instead of: compact1 <- function(x) discard
<https://purrr.tidyverse.org/reference/keep.html>(x, is.null) # we can
write: compact2 <- partial(discard, .p = is.null) # partial() works fine
with functions that do non-standard # evaluation my_long_variable <- 1:10
plot2 <- partial(plot, my_long_variable) plot2()
when i tried to run the examples on this site I got error messages - R
(studio) did not recognise the "partial" function here.  The site did not
say that I needed a particular package to run the "partial" function.
Are there essentially two different things in R both described as "partial"
but which are actually different entities?
Thanks for any elucidation
Nick Wray
#
Hello,


First, your statement can be re-written as

sort(x,partial=p)[p]

since n - (n - p) is p. Second, you need to look at

?sort

And look at section "Arguments" subsection "partial", that should have the
details you're looking for. From what I understand, it guarantees that the
indices of "partial" will be sorted correctly, but all others won't, so
this saves time for things like "median". I hope this helps!
On Mon, Jul 26, 2021, 07:54 Nick Wray <nickmwray at gmail.com> wrote:

            

  
  
#
In this context, "partial" is not the name of any function or package in R.
It is just the name of a parameter.  And its meaning, which is specific to
sort(), is spelled out in the documentation for sort:
...
     If ?partial? is not ?NULL?, it is taken to contain indices of
     elements of the result which are to be placed in their correct
     positions in the sorted array by partial sorting.  For each of the
     result values in a specified position, any values smaller than
     that one are guaranteed to have a smaller index in the sorted
     array and any values which are greater are guaranteed to have a
     bigger index in the sorted array.  (This is included for
     efficiency, and many of the options are not available for partial
     sorting.  It is only substantially more efficient if ?partial? has
     a handful of elements, and a full sort is done (a Quicksort if
     possible) if there are more than 10.)  Names are discarded for
     partial sorting.

 Suppose you had the question
    IF the vector x were sorted, what would its 5th element be?
You could answer that by doing
    sort(x)[5[
but that's more work than you really need.
    sort(x, partial=5)[5]
rearranges x to c(less.than.x.5, x.5, greater.than.x.5).  This is called
partial sorting,   If you wanted the quartiles, then
   sort(x, partial=c(p,q,r))[c(p,q,r)]
will do the job, where p, q, r are the positions where the quartiles
would end up if complete sorting were done.

It's an efficiency hack for computing quantiles, basically.
If you are interested, you could look up
https://en.wikipedia.org/wiki/Quickselect
On Mon, 26 Jul 2021 at 23:54, Nick Wray <nickmwray at gmail.com> wrote: