У меня есть следующий фрейм данных:
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 ответа
Мы можем использовать 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"
Используя строку пакета 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"
Похожие вопросы
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.