【问题标题】:Removing gap between last two words in a string in R删除R中字符串中最后两个单词之间的间隙
【发布时间】:2017-05-08 14:47:09
【问题描述】:

我正在尝试消除包含多个字符串的数据框中最后两个单词之间的间隙。我曾尝试使用gsub,但我对gsub("(\\s){1}$","",df1$V1) 的尝试似乎完全错误! df1 是我的数据集,df2 是我追求的结果。

df1 <- data.frame(V1=c("Apple Pear Orange, AAA 111", "Grapes Banana Pear . BBB 222", "Orange Kiwi Melon , CCC 333", "Apple DDD 444", "Kiwi Melon Orange CCC 333", "Apple Pear Orange, AAA 111", "Tomato Cucumber EEE 222", "Seagull Pigeon ZZZ 111" ), stringsAsFactors = F)

df2 <- data.frame(V1=c("Apple Pear Orange, AAA111", "Grapes Banana Pear . BBB222", "Orange Kiwi Melon , CCC333", "Apple DDD444", "Kiwi Melon Orange CCC333", "Apple Pear Orange, AAA111", "Tomato Cucumber EEE222", "Seagull Pigeon ZZZ111" ), stringsAsFactors = F)

【问题讨论】:

    标签: r string gsub


    【解决方案1】:

    甚至这个:

    gsub("(.*)\\s","\\1",df1$V1)
    

    【讨论】:

    • 这适用于我真实数据集中的所有字符串。谢谢。
    【解决方案2】:

    您可以使用捕获组:

    sub("(.*)\\s+([^\\s]+)$", "\\1\\2", df1$V1)
    #[1] "Apple Pear Orange, AAA111"   "Grapes Banana Pear . BBB222" "Orange Kiwi Melon , CCC333"  "Apple DDD444"               
    #[5] "Kiwi Melon Orange CCC333"    "Apple Pear Orange, AAA111"   "Tomato Cucumber EEE222"      "Seagull Pigeon ZZZ111" 
    

    这将捕获作为第一组任意数量的字符,然后是 1+ 个空格,作为第二组 1+ 个字符,直到字符串末尾不是空格。然后它只提取两个捕获组,中间没有空格。

    【讨论】:

    • 你能用\\w+代替单词吗? gsub("(\\w+) (\\w+$)", "\\1\\2" ,df1$V1)?只是一个想法......
    • @MikeH.,当然可以,但你为什么不提出这个作为单独的答案呢?
    • 谢谢。我不确定为什么,但是当 hhh 和 Mike H. 的答案时,您的语法不适用于我实际数据集中的所有字符串。
    【解决方案3】:

    离开 Docendo 的答案,您可以使用 \\w+ 匹配任意长度的单词:

    gsub("(\\w+)\\s+(\\w+$)", "\\1\\2" ,df1$V1)
    
    #[1] "Apple Pear Orange, AAA111"   "Grapes Banana Pear . BBB222" "Orange Kiwi Melon , CCC333" 
    #[4] "Apple DDD444"                "Kiwi Melon Orange CCC333"    "Apple Pear Orange, AAA111"  
    #[7] "Tomato Cucumber EEE222"      "Seagull Pigeon ZZZ111"
    

    然后您可以对捕获组使用相同的想法。

    【讨论】:

    • 谢谢。这也正是我所追求的,但是正如 hhh 首先回答的那样,我已经接受了他们的解决方案作为答案。