Удалите символы до скобок, но после запятой в R - PullRequest
2 голосов
/ 06 августа 2020

У меня есть следующий фрейм данных:

df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots")

Я хочу удалить слово, предшествующее запятой и круглым скобкам, чтобы мой вывод дал:

[1] "golden,red delicious),cavendish,lady finger),golden pears" "yellow pineapples,roma,vine),orange carrots"

В идеале правая скобка быть также удаленным. Но я могу управлять этим удалением с помощью gsub.

Я чувствую, что ретроспективный просмотр может работать, но не могу правильно его кодировать.

Спасибо!

отредактируйте: Я изменил фрейм данных так, чтобы слово, которое я хочу удалить, было строкой из двух слов.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Используя строку пакета tidyverse, я смог заставить ваши данные выглядеть так, как вы хотите, с двумя вызовами функций, разделенными вертикальной чертой. Канал поступает из пакета magrittr, который загружается с dplyr и / или tidyverse.

Я использовал stringr :: str_replace_all для выполнения двух подстановок, удаляющих слова, которые вы хотели убрать. Обратите внимание на синтаксис для множественных замен в этой функции.

    str_replace_all( c( "first string to get rid of" = "string to replace it with", "second string to get rid of" = "second replacement string")

Вам может показаться более интуитивным объединение всех "избавиться от строк" сначала с последующим объединением заменяющих строк, но каждый элемент в пределах c () - заменяемая строка (в кавычках), связанная с ее заменой (также в кавычках) на "=". Каждая из этих пар replace = замена разделяется запятой.

Используя str_replace, я сначала вынул весь текст, который начинается с «,» и заканчивается на «,)», используя это регулярное выражение », [az] +, \\ ("который относится к запятой, за которой следует любое количество строчных букв и пробелов (что позволяет обнаруживать фрагменты с несколькими словами), за которым следует", (". Обратите внимание на экранирование для" (". Если вы подумали, вместо этого вы можете использовать заглавные буквы [a-zA-Z]. В любом случае обратите внимание на пробел перед "]".

Потому что вы хотели убрать слово, но не запятую перед я заменил удаленный текст на «,».

Это не удаляет «красные яблоки» в первой строке, потому что она не следует за запятой. Выражение «^ [az] +, \ \ ("относится к любому количеству строчных букв и пробелов, стоящих перед", ("в начале строки (^" привязывает "ваш шаблон к началу строки). Поэтому он удаляет" красные яблоки "или любые другие пример, где т ext, который вы хотите удалить, запускает строку. В этих случаях имеет смысл заменить его ничем (""), потому что вы хотите, чтобы первый символ оставшейся строки появлялся в начале.

Вместе эти две замены удаляют оскорбительный текст, независимо от того, начинается ли он строка либо находится в ее середине, либо заканчивается в этом смысле более или менее обобщенно.

str_remove_all ("\\)") удаляет правые круглые скобки по всему тексту

    library(stringr)
    library(magrittr)
    df<-c("red apples,(golden,red delicious),bananas,(cavendish,lady finger),
    golden pears","yellow pineapples,red tomatoes,(roma,vine),orange carrots")


    str_replace_all(df, c(",[a-z ]+,\\(" = ",", 
                  "^[a-z ]+,\\(" = "")) %>%
    str_remove_all("\\)")

    [1] "golden,red delicious,cavendish,lady finger,golden pears"
    [2] "yellow pineapples,roma,vine,orange carrots"  
1 голос
/ 06 августа 2020

Мы можем использовать base R с gsub для удаления символов. Мы сопоставляем слово (\\w+), за которым следует пробел (\\s+), за которым следует слово (\\w+), запятая (,) и (, заменяем пробелом ("")

gsub("\\w+\\s+\\w+,\\(", "", df)
#[1] "golden,red delicious),cavendish,lady finger),golden pears" 
#[2] "yellow pineapples,roma,vine),orange carrots"  

Или, если , является одним из шаблонов для проверки слов, мы можем создать шаблон с символами, которые не являются ,

gsub("[^,]+,\\(", "", df)
#[1] "golden,red delicious),cavendish,lady finger),golden pears" 
#[2] "yellow pineapples,roma,vine),orange carrots" 
...