#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. Как бы я сделал это для набора данных, в котором я хочу удалить все дубликаты в определенном столбце?