Замініть конкретні символи в рядках


262

Я хотів би видалити конкретні символи з рядків у векторному, подібні до функції « Знайти та замінити» в Excel.

Ось дані, з яких я починаю:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Я починаю з першої колонки; Я хочу створити другий стовпець, видаливши e's:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Відповіді:


399

З регулярним виразом і функцією gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Що gsubробить тут , щоб замінити кожне входження "e"з нового рядка "".


Перегляньте ?regexpабо gsubотримайте додаткову допомогу.


15
fixed = TRUEзробив би це швидше.
Rich Scriven

4
@RichScriven ви могли б коротко пояснити, чому?
glaed

6
fixed=TRUEзапобігає використанню регулярних виразів R, які дозволяють більш гнучко відповідати шаблону, але вимагають часу для обчислення. Якщо все, що потрібно, - це видалити один постійний рядок "e", вони не потрібні.
mm689

Був би sub("e", "", group)такий самий результат?
Матей Сантана

просто замінить перше, eщо
знайдене

47

Регулярні вирази - це ваші друзі:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Тепер використовуйте gsub()найпростіший можливий шаблон заміни: порожній рядок:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Також ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
Ну, я міг би похизуватися, що "Ті, хто не розуміє базових функцій, приречені їх замінити". Що саме тут отримує stringr, окрім збільшення кількості підкреслень у вихідному файлі?
Дірк Еддельбюттель

8
" stringr - це набір простих обгортків, які роблять рядкові функції R більш послідовними, простішими та легшими у використанні " від автора пакета. Отже, якщо те, що ви говорите, є істинним (багато підкреслень для завершення базових функцій ...) немає цього пакету для існування (відмова від відповідальності: я в основному використовую функції базового регексу, але я знаю, що вони можуть бути складними для нових користувачів ... )
dickoa

17
@dickoa: str_replaceобгортає sub, тому це замінить лише перше виникнення шаблону. Вам потрібно було б скористатися, str_replace_allякби ви хотіли такої ж поведінки, як gsub.
Джошуа Ульріх

24

Узагальнення двох способів заміни рядків:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Використовуйте gsub

group$group.no.e <- gsub("e", "", group$group)

2) Скористайтеся stringrпакетом

group$group.no.e <- str_replace_all(group$group, "e", "")

І те й інше дасть бажання:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
У той час, коли вам доводилося читати всю сторінку, включаючи коментарі, щоб вивчити синтаксис для stringr, мій вподобаний метод, оскільки це в основному обговорювалося в коментарях. Це рішення швидко представляє обидва варіанти, саме тому я його запропонував. Я сподівався на те, щоб допомогти іншим користувачам фільтрувати так само, як я мав робити, коли я був новаком у Р. Я боровся з gsub, перш ніж знайти стрингер, тому що це не було зазначено у відповіді з високою нагодою. Знову ж таки, мета полягає не в тому, щоб збирати гроші, а намагатися допомогти новим R користувачам.
Мегатрон

Якщо ви знайдете інформацію в інших відповідях / коментарях, які вам здаються корисними і хотіли б перетворити на відповідь, ви можете принаймні надати деяку атрибуцію, щоб показати, звідки ви взяли інформацію / зробіть відповідь Comminuty Wiki, а не просто зробити її як ваш власний.
Девід Аренбург

Дякую - пам’ятайте про наступний раз. Ніколи раніше не робив вікі спільноти, тому не знав, що це варіант.
Мегатрон

1
Варіант 2 чудово працює, коли застосовується до стовпця даних у кадрі даних, не вказуючи всі значення у стовпці. Очевидно, що варіант 1 - це повторення, але варіант 2 працює дуже добре і заслуговує на збільшення голосу за додаткову функціональність.
Phil_T

6

Вам не потрібно створювати кадр даних з векторних рядків, якщо ви хочете замінити деякі символи в ньому. Регулярні вирази - це хороший вибір для нього, як вже згадували @Andrie та @Dirk Eddelbuettel.

Зверніть увагу, якщо ви хочете замінити спеціальні символи, наприклад крапки, вам слід використовувати повний синтаксис регулярного вираження, як показано в прикладі нижче:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

це призведе

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Ви можете просто втекти від них, але вам також потрібно втекти, оскільки персонаж втече, бо це в лапках:gsub("\\.", " ", ctr_names)
Kamil S Jaron,

4

Скористайтеся пакетом stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.