Is there a good reason to use `sort` with `index.return = TRUE` instead of `order`?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
sort
has the argument index.return
which is by default FALSE
. If you set it to TRUE
you get the ordering index... basically the same as when you use order
.
My question
Are there cases where it makes sense to use sort
with index.return = TRUE
instead of order
?
r sorting
add a comment |
sort
has the argument index.return
which is by default FALSE
. If you set it to TRUE
you get the ordering index... basically the same as when you use order
.
My question
Are there cases where it makes sense to use sort
with index.return = TRUE
instead of order
?
r sorting
3
FWIWsort
calls thisx[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.
– hrbrmstr
Nov 16 '18 at 12:58
add a comment |
sort
has the argument index.return
which is by default FALSE
. If you set it to TRUE
you get the ordering index... basically the same as when you use order
.
My question
Are there cases where it makes sense to use sort
with index.return = TRUE
instead of order
?
r sorting
sort
has the argument index.return
which is by default FALSE
. If you set it to TRUE
you get the ordering index... basically the same as when you use order
.
My question
Are there cases where it makes sense to use sort
with index.return = TRUE
instead of order
?
r sorting
r sorting
asked Nov 16 '18 at 12:46
vonjdvonjd
2,13732844
2,13732844
3
FWIWsort
calls thisx[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.
– hrbrmstr
Nov 16 '18 at 12:58
add a comment |
3
FWIWsort
calls thisx[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.
– hrbrmstr
Nov 16 '18 at 12:58
3
3
FWIW
sort
calls this x[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.– hrbrmstr
Nov 16 '18 at 12:58
FWIW
sort
calls this x[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.– hrbrmstr
Nov 16 '18 at 12:58
add a comment |
2 Answers
2
active
oldest
votes
order
simply gives the indexes, instead sort
gives also the values (and with index.return=T
a list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
It seems that order
is a little faster with big numbers (longer vector size):
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
So probably you should pick sort with index.return = TRUE
only if you need a list
object to be returned. I can't find an example where sort
is better than the other.
1
To clarify, by "big numbers" you meanorder
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?
– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you userunif(10000000, 0, 100)
orrunif(10000000, 0, 10000)
.
– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
add a comment |
My suggestions are based on RLave's answer.
You could use the argument method
, sort(x,method="quick",index.return=TRUE)
, and the function might be a little faster than the default. Also if you want a faster (for large vectors) alternative method of this, you can use this function:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
Here are some benchmarks.
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338224%2fis-there-a-good-reason-to-use-sort-with-index-return-true-instead-of-orde%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
order
simply gives the indexes, instead sort
gives also the values (and with index.return=T
a list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
It seems that order
is a little faster with big numbers (longer vector size):
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
So probably you should pick sort with index.return = TRUE
only if you need a list
object to be returned. I can't find an example where sort
is better than the other.
1
To clarify, by "big numbers" you meanorder
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?
– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you userunif(10000000, 0, 100)
orrunif(10000000, 0, 10000)
.
– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
add a comment |
order
simply gives the indexes, instead sort
gives also the values (and with index.return=T
a list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
It seems that order
is a little faster with big numbers (longer vector size):
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
So probably you should pick sort with index.return = TRUE
only if you need a list
object to be returned. I can't find an example where sort
is better than the other.
1
To clarify, by "big numbers" you meanorder
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?
– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you userunif(10000000, 0, 100)
orrunif(10000000, 0, 10000)
.
– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
add a comment |
order
simply gives the indexes, instead sort
gives also the values (and with index.return=T
a list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
It seems that order
is a little faster with big numbers (longer vector size):
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
So probably you should pick sort with index.return = TRUE
only if you need a list
object to be returned. I can't find an example where sort
is better than the other.
order
simply gives the indexes, instead sort
gives also the values (and with index.return=T
a list
):
x <- runif(10, 0, 100)
order(x)
# [1] 2 7 1 9 6 5 8 10 4 3
sort(x, index.return=T)
# $`x`
# [1] 0.08140348 0.18272011 0.23575252 0.51493537 0.64281259 0.92121388 0.93759670 0.96221375 0.97646916 0.97863369
#
# $ix
# [1] 2 7 1 9 6 5 8 10 4 3
It seems that order
is a little faster with big numbers (longer vector size):
x <- runif(10000000, 0, 100)
microbenchmark::microbenchmark(
sort = {sort(x, index.return=T)},
order = {x[order(x)]},
times = 100
)
# Unit: milliseconds
# expr min lq mean median uq max neval
# sort 63.48221 67.79530 78.33724 70.74215 74.10109 173.1129 100
# order 56.46055 57.18649 60.88239 58.29462 62.13086 155.5481 100
So probably you should pick sort with index.return = TRUE
only if you need a list
object to be returned. I can't find an example where sort
is better than the other.
edited Nov 16 '18 at 14:10
answered Nov 16 '18 at 12:55
RLaveRLave
5,28911226
5,28911226
1
To clarify, by "big numbers" you meanorder
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?
– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you userunif(10000000, 0, 100)
orrunif(10000000, 0, 10000)
.
– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
add a comment |
1
To clarify, by "big numbers" you meanorder
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?
– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you userunif(10000000, 0, 100)
orrunif(10000000, 0, 10000)
.
– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
1
1
To clarify, by "big numbers" you mean
order
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?– camille
Nov 16 '18 at 14:04
To clarify, by "big numbers" you mean
order
is faster with sorting vectors with lots of numbers, not numbers that are large in magnitude, right?– camille
Nov 16 '18 at 14:04
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you use
runif(10000000, 0, 100)
or runif(10000000, 0, 10000)
.– RLave
Nov 16 '18 at 14:05
Yes I meant longer vector size. I checked at it seems that even with numbers of bigger magniture is still a little faster. It doesn't change much if you use
runif(10000000, 0, 100)
or runif(10000000, 0, 10000)
.– RLave
Nov 16 '18 at 14:05
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
Sometimes sort(x,method-"quick",...) is faster so you could test also with this arguments. Nice answer.
– Csd
Nov 16 '18 at 17:15
add a comment |
My suggestions are based on RLave's answer.
You could use the argument method
, sort(x,method="quick",index.return=TRUE)
, and the function might be a little faster than the default. Also if you want a faster (for large vectors) alternative method of this, you can use this function:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
Here are some benchmarks.
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE
add a comment |
My suggestions are based on RLave's answer.
You could use the argument method
, sort(x,method="quick",index.return=TRUE)
, and the function might be a little faster than the default. Also if you want a faster (for large vectors) alternative method of this, you can use this function:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
Here are some benchmarks.
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE
add a comment |
My suggestions are based on RLave's answer.
You could use the argument method
, sort(x,method="quick",index.return=TRUE)
, and the function might be a little faster than the default. Also if you want a faster (for large vectors) alternative method of this, you can use this function:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
Here are some benchmarks.
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE
My suggestions are based on RLave's answer.
You could use the argument method
, sort(x,method="quick",index.return=TRUE)
, and the function might be a little faster than the default. Also if you want a faster (for large vectors) alternative method of this, you can use this function:
sort_order <- function(x){
indices <- order(x) #you can choose a method also but leave default.
list("x"=x[indices],"ix"=indices)
}
Here are some benchmarks.
microbenchmark::microbenchmark(
sort=s<-sort(x,index.return=T),
"quick sort"=sq<-sort(x,method="quick",index.return=T),
"order sort"=so<-sort_order(x),times = 10
times=10
)
Unit: seconds
expr min lq mean median uq max neval
sort 1.493714 1.662791 1.737854 1.708502 1.887993 1.960912 10
quick sort 1.366938 1.374874 1.451778 1.444342 1.480122 1.668693 10
order sort 1.181974 1.344398 1.359209 1.369108 1.424569 1.461862 10
all.equal(so,sq)
[1] TRUE
all.equal(s,so)
[1] TRUE
answered Nov 16 '18 at 17:33
CsdCsd
31819
31819
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53338224%2fis-there-a-good-reason-to-use-sort-with-index-return-true-instead-of-orde%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
3
FWIW
sort
calls thisx[order(x, na.last = na.last, decreasing = decreasing)]
for non-integer inputs.– hrbrmstr
Nov 16 '18 at 12:58