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

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
Matt Schroeder 6 Авг 2020 в 03:17

2 ответа

Лучший ответ

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

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" 
1
akrun 6 Авг 2020 в 00:40

Используя строку пакета 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 = replace отделяется запятой.

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

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

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

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

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
RStudious 6 Авг 2020 в 04:47
63275174