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
FWIWsortcalls 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
FWIWsortcalls thisx[order(x, na.last = na.last, decreasing = decreasing)]for non-integer inputs.
– hrbrmstr
Nov 16 '18 at 12:58
add a comment |
3
FWIWsortcalls 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 meanorderis 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 meanorderis 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 meanorderis 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 meanorderis 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 meanorderis 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
sortcalls thisx[order(x, na.last = na.last, decreasing = decreasing)]for non-integer inputs.– hrbrmstr
Nov 16 '18 at 12:58