Удалите повторяющиеся слова, запятые и пробелы

#r #string

#r #строка

Вопрос:

Как я могу удалить все повторяющиеся слова рядом со следующими запятыми и пробелами, используя регулярное выражение в R?

До сих пор я придумал следующее регулярное выражение, которое соответствует дубликату, однако не запятым и пробелам. :

 (bw b)(?=[Ss]*b1b)  

В качестве примера можно привести список:

 blue, red, blue, yellow, green, blue  

Результат должен выглядеть следующим образом:

 blue, red, yellow, green  

Поэтому в этом случае он должен соответствовать двум «синим», а также следующим запятым и пробелам (если они есть).

Комментарии:

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

Ответ №1:

Зависит от того, действительно ли ваш список является списком или это строка с запятыми

 # your data is actually already a list/vector v lt;- c("blue", "red", "blue", "yellow", "green", "blue")  unique(v) [1] "blue" "red" "yellow" "green"  # if your data is actually a comma seperated string s lt;- "blue, red, blue, yellow, green, blue"  # if output needs to be a vector unique(strsplit(s, ", ")[[1]]) [1] "blue" "red" "yellow" "green"   # if output needs to be a string again paste(unique(strsplit(s, ", ")[[1]]), collapse = ", ") [1] "blue, red, yellow, green"  

Пример на основе столбца списка в таблице данных или фрейме данных

 dt lt;- data.table(  id = rep(1:5),  colors = list(  c("blue", "red", "blue", "yellow", "green", "blue"),  c("blue", "blue", "yellow", "green", "blue"),  c("blue", "red", "blue", "yellow"),  c("red", "red", "yellow", "yellow", "green", "blue"),  c("black")  ) )  ## using data.table library(data.table) setDT(dt) # use colors instead of clean_list to just fix the existing column dt[, clean_list := lapply(colors, function(x) unique(x))]  ## using dplyr library(dplyr) # use colors instead of clean_list to just fix the existing column dt %gt;% mutate(clean_list = lapply(colors, function(x) unique(x)))  dt # id colors clean_list # 1: 1 blue,red,blue,yellow,green,blue blue,red,yellow,green # 2: 2 blue,blue,yellow,green,blue blue,yellow,green # 3: 3 blue,red,blue,yellow blue,red,yellow # 4: 4 red,red,yellow,yellow,green,blue red,yellow,green,blue # 5: 5 black black  # or just simply in base dt$colors lt;- lapply(dt$colors, function(x) unique(x))  

Комментарии:

1. Спасибо! Это уже целый список. Как бы я сделал это для набора данных, в котором я хочу удалить все дубликаты в определенном столбце? Каждая строка имеет свой собственный список

2. Я обновлю свой ответ

3. Спасибо! Знаете ли вы какой-нибудь способ сделать это в базе R?

4. dt$colors lt;- lapply(dt$colors, function(x) unique(x))

Ответ №2:

Мы могли бы использовать paste с unique и collapse :

 paste(unique(string), collapse= (", "))   
 [1] "blue, red, yellow, green"  

данные:

 string lt;- c("blue", "red", "blue", "yellow", "green", "blue")  

Комментарии:

1. Как бы я сделал это для набора данных, в котором я хочу удалить все дубликаты в определенном столбце?