Удалить текст между запятой и тире в R с помощью регулярных выражений

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

myvarlabels <- ("participant number, How much do you like the following products-green tea, How much do you like the following products-beer,\"How much, if anything at all, would you be willing to pay for these products if they were ...-Japanese, Chinese, and Indian green tea\",\"How much, if anything at all, would you be willing to pay for these products if they were ...-Japanese, Chinese, and Indian beer\"")

Важно отметить, что метки переменных отображаются в двух разных формах и должны быть сокращены следующим образом:

  • Насколько вам нравятся следующие продукты - зеленый чай
  • следует сократить до: зеленый чай
  • \"Сколько бы вы заплатили за эти продукты, если бы они вообще были...- японский, китайский и зеленый индийский чай \"
  • следует свести к: \"японскому, китайскому и индийскому зеленому чаю \"

Я попытался использовать gsub и регулярные выражения, чтобы идентифицировать, а затем удалить текст между запятыми и тире (т. Е. Заменить текст на "").

Кто-нибудь предлагал, как я мог бы использовать gsub для удаления текста между запятыми, которые указывают начало нового столбца, и черточками, за которыми следует текст, который я хочу сохранить при сохранении двойных кавычек?

РЕДАКТИРОВАТЬ 1

Чтобы быть более точным, данные включают три типа разделенных запятыми кусков текста. Все они указывают, какую информацию содержат соответствующие переменные:

  1. краткие описания, включающие одно или несколько слов (например, номер участника)

  2. более длинные описания, где соответствующая информация появляется только после тире (например, насколько вам нравятся следующие продукты - зеленый чай)

  3. то же самое, что и выше, но с запятыми, присутствующими где-то перед чертой (например, сколько, если вообще что-нибудь, вы бы...); вот почему этому типу фрагмента текста предшествует \" (иначе они не правильно читаются)

  4. То же, что и выше, но без запятых перед тире (например, сколько у вас опыта со следующими продуктами)

Всем четырем типам текстовых последовательностей предшествует запятая, за которой следует произвольный порядок.

Вот новый минимальный пример, который более точно отражает реальные данные, чем мой первый пример:

(myvarlabels3 <- ("participant number,age,gender,body mass index,How much do you like the following products-green tea,How much do you like the following products-beer,outdoor temperature,season,\"How much experience do you have with the following products-Indian spices\",\"How much, if anything at all, would you be willing to pay for these products if they were ...-Japanese, Chinese, and Indian beer\",email,telephone number"))

Код Кэт (Edit 2) работает до определенной точки. Когда я добавляю больше "простых" последовательностей текста типа 1 в начале строки или когда я добавляю текстовую последовательность, указанную в 4. в приведенном выше списке, код больше не работает должным образом.

Однако, когда код Cath из Edit 2 выполняется в два этапа, он работает отлично:

myvarlabels3 <- gsub("((?<=,\")[^-]*[^-]+-)|((?<=,\")[^-],*[^-]+-)", "", myvarlabels3, perl=TRUE) # step 1: shorten the text sequences specified under 3. and 4. in the list above

[1] "participant number,age,gender,body mass index,How much do you like the following products-green tea,How much do you like the following products-beer,outdoor temperature,season,\"Indian spices\",\"Japanese, Chinese, and Indian beer\",email,telephone number"

gsub("((?<=,)[^-\",]+-)", "", myvarlabels3, perl=TRUE) # step 2: shorten the text sequences specified as 2. in the above list

[1] "participant number,age,gender,body mass index,green tea,beer,outdoor temperature,season,\"Indian spices\",\"Japanese, Chinese, and Indian beer\",email,telephone number"

Я думаю, что возможно было бы возможно использовать только одну строку кода, но я не мог понять, как. В любом случае, это значительно облегчит мой рабочий процесс, когда я импортирую грязные CSV-файлы из Qualtrics.

1 ответ

Решение

Я не уверен, что понимаю, какой у вас желаемый результат, но вы можете попытаться определить "начало нового столбца" на основе "Сколько", а затем идти, пока не "встретите" тире:

gsub("(^[^,]+, )|(How much[^-]+-)", "", myvarlabels, perl=TRUE)
[1] "green tea, beer,\"Japanese, Chinese, and Indian green tea\",\"Japanese, Chinese, and Indian beer\""

РЕДАКТИРОВАТЬ

Учитывая ваши шаблоны, вы можете попробовать следующее:

gsub("((?<=, )[^-\"]+-)|((?<=,\")[^-]*,[^-]+-)", "", myvarlabels, perl=TRUE)
[1] "participant number, green tea, beer,\"Japanese, Chinese, and Indian green tea\",\"Japanese, Chinese, and Indian beer\""

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

EDIT2

Если у вас нет пробела между запятой и вопросом, который не начинается с кавычки, вы можете сделать:

myvarlabels_2 <- ("participant number,How much do you like the following products-green tea, How much do you like the following products-beer,\"How much, if anything at all, would you be willing to pay for these products if they were ...-Japanese, Chinese, and Indian green tea\",\"How much, if anything at all, would you be willing to pay for these products if they were ...-Japanese, Chinese, and Indian beer\"")
gsub("((?<=,)[^-\",]+-)|((?<=,\")[^-]*,[^-]+-)", "", myvarlabels_2, perl=TRUE)
[1] "participant number,green tea,beer,\"Japanese, Chinese, and Indian green tea\",\"Japanese, Chinese, and Indian beer\""
Другие вопросы по тегам