Creating alternate series in r





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







9















I have a list of -0.5, -0.6, 0.7, 1, 1.5, 3, -5 and I would like to sort it as 3, -5, 1.5, -0.6, 1, -0.5, 0.7. In other words, I would like to sparate the list into positive and negative lists, then sort them from largest to smallest, but alternating.



How can I do this?










share|improve this question

























  • Is it a list or a vector?

    – Sotos
    Jan 30 at 15:20











  • Do you know that the number of positive and negative numbers are equal?

    – Henry
    Jan 30 at 21:34











  • @Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

    – Math Avengers
    Jan 31 at 6:57


















9















I have a list of -0.5, -0.6, 0.7, 1, 1.5, 3, -5 and I would like to sort it as 3, -5, 1.5, -0.6, 1, -0.5, 0.7. In other words, I would like to sparate the list into positive and negative lists, then sort them from largest to smallest, but alternating.



How can I do this?










share|improve this question

























  • Is it a list or a vector?

    – Sotos
    Jan 30 at 15:20











  • Do you know that the number of positive and negative numbers are equal?

    – Henry
    Jan 30 at 21:34











  • @Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

    – Math Avengers
    Jan 31 at 6:57














9












9








9








I have a list of -0.5, -0.6, 0.7, 1, 1.5, 3, -5 and I would like to sort it as 3, -5, 1.5, -0.6, 1, -0.5, 0.7. In other words, I would like to sparate the list into positive and negative lists, then sort them from largest to smallest, but alternating.



How can I do this?










share|improve this question
















I have a list of -0.5, -0.6, 0.7, 1, 1.5, 3, -5 and I would like to sort it as 3, -5, 1.5, -0.6, 1, -0.5, 0.7. In other words, I would like to sparate the list into positive and negative lists, then sort them from largest to smallest, but alternating.



How can I do this?







r sorting






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 31 at 6:10









Darren Tsai

2,6472531




2,6472531










asked Jan 30 at 15:17









Math AvengersMath Avengers

516




516













  • Is it a list or a vector?

    – Sotos
    Jan 30 at 15:20











  • Do you know that the number of positive and negative numbers are equal?

    – Henry
    Jan 30 at 21:34











  • @Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

    – Math Avengers
    Jan 31 at 6:57



















  • Is it a list or a vector?

    – Sotos
    Jan 30 at 15:20











  • Do you know that the number of positive and negative numbers are equal?

    – Henry
    Jan 30 at 21:34











  • @Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

    – Math Avengers
    Jan 31 at 6:57

















Is it a list or a vector?

– Sotos
Jan 30 at 15:20





Is it a list or a vector?

– Sotos
Jan 30 at 15:20













Do you know that the number of positive and negative numbers are equal?

– Henry
Jan 30 at 21:34





Do you know that the number of positive and negative numbers are equal?

– Henry
Jan 30 at 21:34













@Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

– Math Avengers
Jan 31 at 6:57





@Henry they are not actually ! But I can't really change them, so I will just leave them as what they are.

– Math Avengers
Jan 31 at 6:57












4 Answers
4






active

oldest

votes


















8














Data



x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)


Use rbind() to create an alternate indices vector.



ind <- seq_along(x)
sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
# [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7




This method above should be memory consuming because it will create a twice longer vector. To conquer it, you can set a midpoint as the end index. In this case, it will be ceiling(7 / 2) = 4.



n <- length(x)
ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
# [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7





share|improve this answer

































    5














    We can split the list based on sign and sort them. We then create a new list by taking alternating elements from positive and negative lists making sure to reverse the positive part of the list.



    new_list <- sapply(split(x, sign(x)), sort)
    c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
    #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


    data



    x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )





    share|improve this answer

































      2














      One option is to split the vector by the sign of the vector into a list of vectors, loop through the vector, order the absolute value of the elements in decreasing order, get the lengths of the list elements same with padding NA at the end, rbind them together as a matrix, convert it to vector with c and remove the NA elements with na.omit



      lst1 <- sapply(split(v1, sign(v1)), function(x)  
      x[order(abs(x), decreasing = TRUE)])[2:1]
      c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
      #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


      data



      v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)





      share|improve this answer































        1














        How about



        pos <- sort(x[x>0], decreasing = T)
        neg <- sort(x[x<0], decreasing = T)

        c(rbind(pos,neg))[1:length(x)]

        #[1] 3.0 -0.5 1.5 -0.6 1.0 -5.0 0.7





        share|improve this answer
























          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
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54443833%2fcreating-alternate-series-in-r%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          4 Answers
          4






          active

          oldest

          votes








          4 Answers
          4






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          8














          Data



          x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)


          Use rbind() to create an alternate indices vector.



          ind <- seq_along(x)
          sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
          # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7




          This method above should be memory consuming because it will create a twice longer vector. To conquer it, you can set a midpoint as the end index. In this case, it will be ceiling(7 / 2) = 4.



          n <- length(x)
          ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
          sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
          # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7





          share|improve this answer






























            8














            Data



            x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)


            Use rbind() to create an alternate indices vector.



            ind <- seq_along(x)
            sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
            # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7




            This method above should be memory consuming because it will create a twice longer vector. To conquer it, you can set a midpoint as the end index. In this case, it will be ceiling(7 / 2) = 4.



            n <- length(x)
            ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
            sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
            # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7





            share|improve this answer




























              8












              8








              8







              Data



              x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)


              Use rbind() to create an alternate indices vector.



              ind <- seq_along(x)
              sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
              # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7




              This method above should be memory consuming because it will create a twice longer vector. To conquer it, you can set a midpoint as the end index. In this case, it will be ceiling(7 / 2) = 4.



              n <- length(x)
              ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
              sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
              # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7





              share|improve this answer















              Data



              x <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)


              Use rbind() to create an alternate indices vector.



              ind <- seq_along(x)
              sort(x, decreasing = T)[c(rbind(ind, rev(ind)))][ind]
              # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7




              This method above should be memory consuming because it will create a twice longer vector. To conquer it, you can set a midpoint as the end index. In this case, it will be ceiling(7 / 2) = 4.



              n <- length(x)
              ind <- 1:ceiling(n / 2) # [1] 1 2 3 4
              sort(x, decreasing = T)[c(rbind(ind, (n:1)[ind]))][1:n]
              # [1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited Jan 30 at 17:39

























              answered Jan 30 at 15:30









              Darren TsaiDarren Tsai

              2,6472531




              2,6472531

























                  5














                  We can split the list based on sign and sort them. We then create a new list by taking alternating elements from positive and negative lists making sure to reverse the positive part of the list.



                  new_list <- sapply(split(x, sign(x)), sort)
                  c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
                  #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                  data



                  x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )





                  share|improve this answer






























                    5














                    We can split the list based on sign and sort them. We then create a new list by taking alternating elements from positive and negative lists making sure to reverse the positive part of the list.



                    new_list <- sapply(split(x, sign(x)), sort)
                    c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
                    #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                    data



                    x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )





                    share|improve this answer




























                      5












                      5








                      5







                      We can split the list based on sign and sort them. We then create a new list by taking alternating elements from positive and negative lists making sure to reverse the positive part of the list.



                      new_list <- sapply(split(x, sign(x)), sort)
                      c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
                      #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                      data



                      x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )





                      share|improve this answer















                      We can split the list based on sign and sort them. We then create a new list by taking alternating elements from positive and negative lists making sure to reverse the positive part of the list.



                      new_list <- sapply(split(x, sign(x)), sort)
                      c(rbind(rev(new_list[['1']]), new_list[['-1']]))[1:length(x)]
                      #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                      data



                      x <- c(-0.5, -.6, 0.7, 1, 1.5, 3, -5 )






                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Jan 30 at 15:34

























                      answered Jan 30 at 15:26









                      Ronak ShahRonak Shah

                      45.1k104266




                      45.1k104266























                          2














                          One option is to split the vector by the sign of the vector into a list of vectors, loop through the vector, order the absolute value of the elements in decreasing order, get the lengths of the list elements same with padding NA at the end, rbind them together as a matrix, convert it to vector with c and remove the NA elements with na.omit



                          lst1 <- sapply(split(v1, sign(v1)), function(x)  
                          x[order(abs(x), decreasing = TRUE)])[2:1]
                          c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
                          #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                          data



                          v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)





                          share|improve this answer




























                            2














                            One option is to split the vector by the sign of the vector into a list of vectors, loop through the vector, order the absolute value of the elements in decreasing order, get the lengths of the list elements same with padding NA at the end, rbind them together as a matrix, convert it to vector with c and remove the NA elements with na.omit



                            lst1 <- sapply(split(v1, sign(v1)), function(x)  
                            x[order(abs(x), decreasing = TRUE)])[2:1]
                            c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
                            #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                            data



                            v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)





                            share|improve this answer


























                              2












                              2








                              2







                              One option is to split the vector by the sign of the vector into a list of vectors, loop through the vector, order the absolute value of the elements in decreasing order, get the lengths of the list elements same with padding NA at the end, rbind them together as a matrix, convert it to vector with c and remove the NA elements with na.omit



                              lst1 <- sapply(split(v1, sign(v1)), function(x)  
                              x[order(abs(x), decreasing = TRUE)])[2:1]
                              c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
                              #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                              data



                              v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)





                              share|improve this answer













                              One option is to split the vector by the sign of the vector into a list of vectors, loop through the vector, order the absolute value of the elements in decreasing order, get the lengths of the list elements same with padding NA at the end, rbind them together as a matrix, convert it to vector with c and remove the NA elements with na.omit



                              lst1 <- sapply(split(v1, sign(v1)), function(x)  
                              x[order(abs(x), decreasing = TRUE)])[2:1]
                              c(na.omit(c(do.call(rbind, lapply(lst1, `length<-`, max(lengths(lst1)))))))
                              #[1] 3.0 -5.0 1.5 -0.6 1.0 -0.5 0.7


                              data



                              v1 <- c(-0.5, -0.6, 0.7, 1, 1.5, 3, -5)






                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Jan 30 at 15:22









                              akrunakrun

                              419k13207283




                              419k13207283























                                  1














                                  How about



                                  pos <- sort(x[x>0], decreasing = T)
                                  neg <- sort(x[x<0], decreasing = T)

                                  c(rbind(pos,neg))[1:length(x)]

                                  #[1] 3.0 -0.5 1.5 -0.6 1.0 -5.0 0.7





                                  share|improve this answer




























                                    1














                                    How about



                                    pos <- sort(x[x>0], decreasing = T)
                                    neg <- sort(x[x<0], decreasing = T)

                                    c(rbind(pos,neg))[1:length(x)]

                                    #[1] 3.0 -0.5 1.5 -0.6 1.0 -5.0 0.7





                                    share|improve this answer


























                                      1












                                      1








                                      1







                                      How about



                                      pos <- sort(x[x>0], decreasing = T)
                                      neg <- sort(x[x<0], decreasing = T)

                                      c(rbind(pos,neg))[1:length(x)]

                                      #[1] 3.0 -0.5 1.5 -0.6 1.0 -5.0 0.7





                                      share|improve this answer













                                      How about



                                      pos <- sort(x[x>0], decreasing = T)
                                      neg <- sort(x[x<0], decreasing = T)

                                      c(rbind(pos,neg))[1:length(x)]

                                      #[1] 3.0 -0.5 1.5 -0.6 1.0 -5.0 0.7






                                      share|improve this answer












                                      share|improve this answer



                                      share|improve this answer










                                      answered Jan 30 at 16:30









                                      989989

                                      9,08251835




                                      9,08251835






























                                          draft saved

                                          draft discarded




















































                                          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.




                                          draft saved


                                          draft discarded














                                          StackExchange.ready(
                                          function () {
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54443833%2fcreating-alternate-series-in-r%23new-answer', 'question_page');
                                          }
                                          );

                                          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







                                          Popular posts from this blog

                                          Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                                          ts Property 'filter' does not exist on type '{}'

                                          mat-slide-toggle shouldn't change it's state when I click cancel in confirmation window