Get the characters after a certain pattern in R - regex










1















I have a data frame with one column:



df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
df$cat <- as.character(df$cat)
df$cat


How can I extract the characters that appear after c(", sometimes there is only one backslash and sometimes there's 2. Similarly with the characters, sometimes the characters are 2 and sometimes they are 3. e.g. BP2, BP etc.



So far I have tried:



substr(x = df$cat, start = 4, stop = 6)


But this results in:



 ""BP" "BP2" "BPT" "CN""


And I only want the output to show



"BPT" "BP2" "BPT" "CN"









share|improve this question



















  • 2





    Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

    – Wiktor Stribiżew
    Nov 13 '18 at 13:55











  • Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

    – Wiktor Stribiżew
    Nov 13 '18 at 14:00












  • Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

    – Syed
    Nov 13 '18 at 14:08






  • 1





    Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

    – Wiktor Stribiżew
    Nov 13 '18 at 14:13












  • Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

    – Wiktor Stribiżew
    Nov 13 '18 at 14:21















1















I have a data frame with one column:



df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
df$cat <- as.character(df$cat)
df$cat


How can I extract the characters that appear after c(", sometimes there is only one backslash and sometimes there's 2. Similarly with the characters, sometimes the characters are 2 and sometimes they are 3. e.g. BP2, BP etc.



So far I have tried:



substr(x = df$cat, start = 4, stop = 6)


But this results in:



 ""BP" "BP2" "BPT" "CN""


And I only want the output to show



"BPT" "BP2" "BPT" "CN"









share|improve this question



















  • 2





    Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

    – Wiktor Stribiżew
    Nov 13 '18 at 13:55











  • Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

    – Wiktor Stribiżew
    Nov 13 '18 at 14:00












  • Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

    – Syed
    Nov 13 '18 at 14:08






  • 1





    Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

    – Wiktor Stribiżew
    Nov 13 '18 at 14:13












  • Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

    – Wiktor Stribiżew
    Nov 13 '18 at 14:21













1












1








1








I have a data frame with one column:



df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
df$cat <- as.character(df$cat)
df$cat


How can I extract the characters that appear after c(", sometimes there is only one backslash and sometimes there's 2. Similarly with the characters, sometimes the characters are 2 and sometimes they are 3. e.g. BP2, BP etc.



So far I have tried:



substr(x = df$cat, start = 4, stop = 6)


But this results in:



 ""BP" "BP2" "BPT" "CN""


And I only want the output to show



"BPT" "BP2" "BPT" "CN"









share|improve this question
















I have a data frame with one column:



df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
df$cat <- as.character(df$cat)
df$cat


How can I extract the characters that appear after c(", sometimes there is only one backslash and sometimes there's 2. Similarly with the characters, sometimes the characters are 2 and sometimes they are 3. e.g. BP2, BP etc.



So far I have tried:



substr(x = df$cat, start = 4, stop = 6)


But this results in:



 ""BP" "BP2" "BPT" "CN""


And I only want the output to show



"BPT" "BP2" "BPT" "CN"






regex string rstudio text-extraction






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 13 '18 at 15:35







Syed

















asked Nov 13 '18 at 13:47









SyedSyed

8310




8310







  • 2





    Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

    – Wiktor Stribiżew
    Nov 13 '18 at 13:55











  • Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

    – Wiktor Stribiżew
    Nov 13 '18 at 14:00












  • Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

    – Syed
    Nov 13 '18 at 14:08






  • 1





    Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

    – Wiktor Stribiżew
    Nov 13 '18 at 14:13












  • Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

    – Wiktor Stribiżew
    Nov 13 '18 at 14:21












  • 2





    Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

    – Wiktor Stribiżew
    Nov 13 '18 at 13:55











  • Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

    – Wiktor Stribiżew
    Nov 13 '18 at 14:00












  • Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

    – Syed
    Nov 13 '18 at 14:08






  • 1





    Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

    – Wiktor Stribiżew
    Nov 13 '18 at 14:13












  • Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

    – Wiktor Stribiżew
    Nov 13 '18 at 14:21







2




2





Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

– Wiktor Stribiżew
Nov 13 '18 at 13:55





Try lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x)))

– Wiktor Stribiżew
Nov 13 '18 at 13:55













Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

– Wiktor Stribiżew
Nov 13 '18 at 14:00






Or gsub('^c\(|\)$|\\(")', '\1', df$cat)

– Wiktor Stribiżew
Nov 13 '18 at 14:00














Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

– Syed
Nov 13 '18 at 14:08





Thanks @WiktorStribiżew. I tried both, the first one outputs both the texts - BPT and BP. The 2nd piece is also outputting both and I only need one - the first one

– Syed
Nov 13 '18 at 14:08




1




1





Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

– Wiktor Stribiżew
Nov 13 '18 at 14:13






Maybe lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]])? Or unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))? See ideone.com/xImbjP

– Wiktor Stribiżew
Nov 13 '18 at 14:13














Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

– Wiktor Stribiżew
Nov 13 '18 at 14:21





Just let know if the first BP in your expected output is a typo or not, I understand you need "BPT" "BP2" "BPT" "CN" and not "BP" "BP2" "BPT" "CN"

– Wiktor Stribiżew
Nov 13 '18 at 14:21












1 Answer
1






active

oldest

votes


















1














You may use



df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
df$cat <- as.character(df$cat)
unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))
## => [1] "BPT" "BP2" "BPT" "CN"


See the R demo online.



Notes




  • gsub('\', '', df$cat, fixed=TRUE) removes all backslashes. You may use gsub('\"', '"', df$cat, fixed=TRUE) if you only plan to remove backslashes before ".


  • eval(parse(text=x))[[1]] parses the vector and returns the first item


  • lapply helps traverse the whole data you have. See Using sapply and lapply.





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%2f53282466%2fget-the-characters-after-a-certain-pattern-in-r-regex%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    You may use



    df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
    df$cat <- as.character(df$cat)
    unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))
    ## => [1] "BPT" "BP2" "BPT" "CN"


    See the R demo online.



    Notes




    • gsub('\', '', df$cat, fixed=TRUE) removes all backslashes. You may use gsub('\"', '"', df$cat, fixed=TRUE) if you only plan to remove backslashes before ".


    • eval(parse(text=x))[[1]] parses the vector and returns the first item


    • lapply helps traverse the whole data you have. See Using sapply and lapply.





    share|improve this answer



























      1














      You may use



      df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
      df$cat <- as.character(df$cat)
      unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))
      ## => [1] "BPT" "BP2" "BPT" "CN"


      See the R demo online.



      Notes




      • gsub('\', '', df$cat, fixed=TRUE) removes all backslashes. You may use gsub('\"', '"', df$cat, fixed=TRUE) if you only plan to remove backslashes before ".


      • eval(parse(text=x))[[1]] parses the vector and returns the first item


      • lapply helps traverse the whole data you have. See Using sapply and lapply.





      share|improve this answer

























        1












        1








        1







        You may use



        df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
        df$cat <- as.character(df$cat)
        unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))
        ## => [1] "BPT" "BP2" "BPT" "CN"


        See the R demo online.



        Notes




        • gsub('\', '', df$cat, fixed=TRUE) removes all backslashes. You may use gsub('\"', '"', df$cat, fixed=TRUE) if you only plan to remove backslashes before ".


        • eval(parse(text=x))[[1]] parses the vector and returns the first item


        • lapply helps traverse the whole data you have. See Using sapply and lapply.





        share|improve this answer













        You may use



        df <- data.frame(cat = c("c(\"BPT\", "BP")", "c("BP2", "BP")", "c("BPT", "BP")", "c("CN", "NC")"))
        df$cat <- as.character(df$cat)
        unlist(lapply(gsub('\', '', df$cat, fixed=TRUE), function(x) eval(parse(text=x))[[1]]))
        ## => [1] "BPT" "BP2" "BPT" "CN"


        See the R demo online.



        Notes




        • gsub('\', '', df$cat, fixed=TRUE) removes all backslashes. You may use gsub('\"', '"', df$cat, fixed=TRUE) if you only plan to remove backslashes before ".


        • eval(parse(text=x))[[1]] parses the vector and returns the first item


        • lapply helps traverse the whole data you have. See Using sapply and lapply.






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 13 '18 at 15:22









        Wiktor StribiżewWiktor Stribiżew

        316k16134215




        316k16134215





























            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%2f53282466%2fget-the-characters-after-a-certain-pattern-in-r-regex%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

            Darth Vader #20

            How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

            Ondo