Transform variable length list into matrix in R












2















If I had a list of vectors of variable lengths :



[[1]]
[1] 1 2 3 4

[[2]]
[1] 4 5 6

[[3]]
[1] 1 2 3 4 5 6 7 8 9

[[4]]
[1] 'a' 'b' 'c'


How could I transform this into a data frame / logical matrix with elements of the list represented as columns?



i.e a dataframe like:



    1 2 3 4 5 6 7 8 9 'a' 'b' 'c'
[1] 1 1 1 1 0 0 0 0 0 0 0 0
[2] 0 0 0 1 1 1 0 0 0 0 0 0
[3] 1 1 1 1 1 1 1 1 1 0 0 0
[4] 0 0 0 0 0 0 0 0 0 1 1 1


some data:



x <- list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9), c("a", "b", "c"))









share|improve this question





























    2















    If I had a list of vectors of variable lengths :



    [[1]]
    [1] 1 2 3 4

    [[2]]
    [1] 4 5 6

    [[3]]
    [1] 1 2 3 4 5 6 7 8 9

    [[4]]
    [1] 'a' 'b' 'c'


    How could I transform this into a data frame / logical matrix with elements of the list represented as columns?



    i.e a dataframe like:



        1 2 3 4 5 6 7 8 9 'a' 'b' 'c'
    [1] 1 1 1 1 0 0 0 0 0 0 0 0
    [2] 0 0 0 1 1 1 0 0 0 0 0 0
    [3] 1 1 1 1 1 1 1 1 1 0 0 0
    [4] 0 0 0 0 0 0 0 0 0 1 1 1


    some data:



    x <- list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9), c("a", "b", "c"))









    share|improve this question



























      2












      2








      2








      If I had a list of vectors of variable lengths :



      [[1]]
      [1] 1 2 3 4

      [[2]]
      [1] 4 5 6

      [[3]]
      [1] 1 2 3 4 5 6 7 8 9

      [[4]]
      [1] 'a' 'b' 'c'


      How could I transform this into a data frame / logical matrix with elements of the list represented as columns?



      i.e a dataframe like:



          1 2 3 4 5 6 7 8 9 'a' 'b' 'c'
      [1] 1 1 1 1 0 0 0 0 0 0 0 0
      [2] 0 0 0 1 1 1 0 0 0 0 0 0
      [3] 1 1 1 1 1 1 1 1 1 0 0 0
      [4] 0 0 0 0 0 0 0 0 0 1 1 1


      some data:



      x <- list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9), c("a", "b", "c"))









      share|improve this question
















      If I had a list of vectors of variable lengths :



      [[1]]
      [1] 1 2 3 4

      [[2]]
      [1] 4 5 6

      [[3]]
      [1] 1 2 3 4 5 6 7 8 9

      [[4]]
      [1] 'a' 'b' 'c'


      How could I transform this into a data frame / logical matrix with elements of the list represented as columns?



      i.e a dataframe like:



          1 2 3 4 5 6 7 8 9 'a' 'b' 'c'
      [1] 1 1 1 1 0 0 0 0 0 0 0 0
      [2] 0 0 0 1 1 1 0 0 0 0 0 0
      [3] 1 1 1 1 1 1 1 1 1 0 0 0
      [4] 0 0 0 0 0 0 0 0 0 1 1 1


      some data:



      x <- list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9), c("a", "b", "c"))






      r






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 16 '18 at 10:58









      markus

      14.9k11336




      14.9k11336










      asked Nov 16 '18 at 7:02









      user124123user124123

      46911238




      46911238
























          3 Answers
          3






          active

          oldest

          votes


















          5














          Here is a base R option:



          # extract unique values from x
          uv <- unique(unlist(x))
          # Check in each element of lists which values are present and bind everything toegether
          out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
          # Convert from matrix to data.frame and add column names
          out <- setNames(as.data.frame(out), uv)
          out

          1 2 3 4 5 6 7 8 9 a b c
          1 1 1 1 1 0 0 0 0 0 0 0 0
          2 0 0 0 1 1 1 0 0 0 0 0 0
          3 1 1 1 1 1 1 1 1 1 0 0 0
          4 0 0 0 0 0 0 0 0 0 1 1 1





          share|improve this answer

































            2














            Here is a base R option with stack and table



            table(stack(setNames(x, seq_along(x)))[2:1])
            # values
            #ind 1 2 3 4 5 6 7 8 9 a b c
            # 1 1 1 1 1 0 0 0 0 0 0 0 0
            # 2 0 0 0 1 1 1 0 0 0 0 0 0
            # 3 1 1 1 1 1 1 1 1 1 0 0 0
            # 4 0 0 0 0 0 0 0 0 0 1 1 1





            share|improve this answer































              1














              Something like this?



              library(tidyverse)
              x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
              y = tibble(column1= map_chr(x, str_flatten, " "))


              Where y is this:



              # A tibble: 3 x 1
              column1
              <chr>
              1 1 2 3 4
              2 4 5 6
              3 1 2 3 4 5 6 7 8 9





              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%2f53332952%2ftransform-variable-length-list-into-matrix-in-r%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                5














                Here is a base R option:



                # extract unique values from x
                uv <- unique(unlist(x))
                # Check in each element of lists which values are present and bind everything toegether
                out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
                # Convert from matrix to data.frame and add column names
                out <- setNames(as.data.frame(out), uv)
                out

                1 2 3 4 5 6 7 8 9 a b c
                1 1 1 1 1 0 0 0 0 0 0 0 0
                2 0 0 0 1 1 1 0 0 0 0 0 0
                3 1 1 1 1 1 1 1 1 1 0 0 0
                4 0 0 0 0 0 0 0 0 0 1 1 1





                share|improve this answer






























                  5














                  Here is a base R option:



                  # extract unique values from x
                  uv <- unique(unlist(x))
                  # Check in each element of lists which values are present and bind everything toegether
                  out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
                  # Convert from matrix to data.frame and add column names
                  out <- setNames(as.data.frame(out), uv)
                  out

                  1 2 3 4 5 6 7 8 9 a b c
                  1 1 1 1 1 0 0 0 0 0 0 0 0
                  2 0 0 0 1 1 1 0 0 0 0 0 0
                  3 1 1 1 1 1 1 1 1 1 0 0 0
                  4 0 0 0 0 0 0 0 0 0 1 1 1





                  share|improve this answer




























                    5












                    5








                    5







                    Here is a base R option:



                    # extract unique values from x
                    uv <- unique(unlist(x))
                    # Check in each element of lists which values are present and bind everything toegether
                    out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
                    # Convert from matrix to data.frame and add column names
                    out <- setNames(as.data.frame(out), uv)
                    out

                    1 2 3 4 5 6 7 8 9 a b c
                    1 1 1 1 1 0 0 0 0 0 0 0 0
                    2 0 0 0 1 1 1 0 0 0 0 0 0
                    3 1 1 1 1 1 1 1 1 1 0 0 0
                    4 0 0 0 0 0 0 0 0 0 1 1 1





                    share|improve this answer















                    Here is a base R option:



                    # extract unique values from x
                    uv <- unique(unlist(x))
                    # Check in each element of lists which values are present and bind everything toegether
                    out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
                    # Convert from matrix to data.frame and add column names
                    out <- setNames(as.data.frame(out), uv)
                    out

                    1 2 3 4 5 6 7 8 9 a b c
                    1 1 1 1 1 0 0 0 0 0 0 0 0
                    2 0 0 0 1 1 1 0 0 0 0 0 0
                    3 1 1 1 1 1 1 1 1 1 0 0 0
                    4 0 0 0 0 0 0 0 0 0 1 1 1






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Nov 16 '18 at 7:57

























                    answered Nov 16 '18 at 7:43









                    sindri_baldursindri_baldur

                    8,3651033




                    8,3651033

























                        2














                        Here is a base R option with stack and table



                        table(stack(setNames(x, seq_along(x)))[2:1])
                        # values
                        #ind 1 2 3 4 5 6 7 8 9 a b c
                        # 1 1 1 1 1 0 0 0 0 0 0 0 0
                        # 2 0 0 0 1 1 1 0 0 0 0 0 0
                        # 3 1 1 1 1 1 1 1 1 1 0 0 0
                        # 4 0 0 0 0 0 0 0 0 0 1 1 1





                        share|improve this answer




























                          2














                          Here is a base R option with stack and table



                          table(stack(setNames(x, seq_along(x)))[2:1])
                          # values
                          #ind 1 2 3 4 5 6 7 8 9 a b c
                          # 1 1 1 1 1 0 0 0 0 0 0 0 0
                          # 2 0 0 0 1 1 1 0 0 0 0 0 0
                          # 3 1 1 1 1 1 1 1 1 1 0 0 0
                          # 4 0 0 0 0 0 0 0 0 0 1 1 1





                          share|improve this answer


























                            2












                            2








                            2







                            Here is a base R option with stack and table



                            table(stack(setNames(x, seq_along(x)))[2:1])
                            # values
                            #ind 1 2 3 4 5 6 7 8 9 a b c
                            # 1 1 1 1 1 0 0 0 0 0 0 0 0
                            # 2 0 0 0 1 1 1 0 0 0 0 0 0
                            # 3 1 1 1 1 1 1 1 1 1 0 0 0
                            # 4 0 0 0 0 0 0 0 0 0 1 1 1





                            share|improve this answer













                            Here is a base R option with stack and table



                            table(stack(setNames(x, seq_along(x)))[2:1])
                            # values
                            #ind 1 2 3 4 5 6 7 8 9 a b c
                            # 1 1 1 1 1 0 0 0 0 0 0 0 0
                            # 2 0 0 0 1 1 1 0 0 0 0 0 0
                            # 3 1 1 1 1 1 1 1 1 1 0 0 0
                            # 4 0 0 0 0 0 0 0 0 0 1 1 1






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Nov 16 '18 at 16:31









                            akrunakrun

                            418k13206281




                            418k13206281























                                1














                                Something like this?



                                library(tidyverse)
                                x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
                                y = tibble(column1= map_chr(x, str_flatten, " "))


                                Where y is this:



                                # A tibble: 3 x 1
                                column1
                                <chr>
                                1 1 2 3 4
                                2 4 5 6
                                3 1 2 3 4 5 6 7 8 9





                                share|improve this answer




























                                  1














                                  Something like this?



                                  library(tidyverse)
                                  x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
                                  y = tibble(column1= map_chr(x, str_flatten, " "))


                                  Where y is this:



                                  # A tibble: 3 x 1
                                  column1
                                  <chr>
                                  1 1 2 3 4
                                  2 4 5 6
                                  3 1 2 3 4 5 6 7 8 9





                                  share|improve this answer


























                                    1












                                    1








                                    1







                                    Something like this?



                                    library(tidyverse)
                                    x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
                                    y = tibble(column1= map_chr(x, str_flatten, " "))


                                    Where y is this:



                                    # A tibble: 3 x 1
                                    column1
                                    <chr>
                                    1 1 2 3 4
                                    2 4 5 6
                                    3 1 2 3 4 5 6 7 8 9





                                    share|improve this answer













                                    Something like this?



                                    library(tidyverse)
                                    x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
                                    y = tibble(column1= map_chr(x, str_flatten, " "))


                                    Where y is this:



                                    # A tibble: 3 x 1
                                    column1
                                    <chr>
                                    1 1 2 3 4
                                    2 4 5 6
                                    3 1 2 3 4 5 6 7 8 9






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Nov 16 '18 at 7:12









                                    wl1234wl1234

                                    461316




                                    461316






























                                        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%2f53332952%2ftransform-variable-length-list-into-matrix-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

                                        The Sandy Post

                                        Danny Elfman

                                        Pages that link to "Head v. Amoskeag Manufacturing Co."