2013-06-30 3 views
4

Как удалить периоды перед первой запятой в этих строках?Удалить периоды перед первой запятой в строке

xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
      "fefe3. fregg, ff, 34.gr. trgw", 
      "fefe3 fregg, ff, 34.gr. tr.gw") 

Желаемый результат:

"fefe3 fregg, ff, 34.gr. trgw" 
    "fefe3 fregg, ff, 34.gr. trgw" 
    "fefe3 fregg, ff, 34.gr. tr.gw" 

Я начал с gsub("\\.","", xx)), который удаляет все периоды. Как изменить его, чтобы указать «только период до первой запятой»?

ответ

4

Я чувствую, что это обман, но он работает на этом простом примере ....

xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
     "fefe3. fregg, ff, 34.gr. trgw", 
     "fefe3 fregg, ff, 34.gr. tr.gw") 

temp <- strsplit(xx, ",") 

sapply(seq_along(temp), function(x) { 
    t1 <- gsub("\\.", "", temp[[x]][1]) 
    paste(t1, temp[[x]][2], temp[[x]][-c(1, 2)], sep = ",") 
}) 
# [1] "fefe3 fregg, ff, 34.gr. trgw" "fefe3 fregg, ff, 34.gr. trgw" 
# [3] "fefe3 fregg, ff, 34.gr. tr.gw" 

Основная идея выше в том, что, поскольку вы только собираетесь смотреть на период в первом фрагменте перед запятой, почему бы не разделить его и использовать на нем базовый gsub, а затем снова собрать части. Вряд ли будет эффективным ....

+0

Большое спасибо! Это также делает работу на моем фактическом прецеденте. Я думал, что может быть решение с меньшим количеством символов (я ленивая машинистка), но это привело меня в порядок, и это все, что имеет значение в этом случае. Еще раз спасибо! – Ben

+0

@Ben, я уверен, что есть, но иногда слишком много думать о регулярных выражениях дает мне замораживание мозга. :) – A5C1D2H2I1M1N2O1R2T1

+0

heh! Я точно знаю, что вы имеете в виду. Я полный regex-идиот. – Ben

3

Попробуйте это:

gsub("\\.(.*,.*)","\\1", xx) 
[1] "fefe3 fregg, ff, 34.gr. trgw" 
[2] "fefe3 fregg, ff, 34.gr. trgw" 
[3] "fefe3 fregg, ff, 34.gr. tr.gw" 

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

  • \\. ищет период
  • (.*,.*) ищет запятую внутри другого текста, и группы его
  • \\1 относится к первой группе
+1

Спасибо за подробности, я ценю это. С вашей линией я все еще получаю один период в первом элементе: '' fefe3. Fregg, ff, 34.gr. trgw "' (возможно, вы получили раннее редактирование моего Q, когда данные примера были немного разными, извините за путаница!) – Ben

+0

@Ben, вы можете просто вставить «gsub» Andrie здесь и получить свой ответ тоже: 'gsub (" \\. (. *,. *) "," \\ 1 ", gsub (" \\ . (. *,. *) "," \\ 1 ", xx))'. Это зависит от того, насколько вы знаете, сколько периодов вы можете ожидать до первой запятой или ваших навыков при написании рекурсивных функций .... – A5C1D2H2I1M1N2O1R2T1

+1

@AnandaMahto, спасибо, я не знаю, сколько периодов ожидать, и меня там нет но с точки зрения написания рекурсивных функций ... – Ben

1

Это использует gsubfn в gsubfn package, чтобы извлечь самую длинную подстроку, начиная с начала строки и не содержащую запятых. (Это была бы целая строка, если в ней не было никаких запятых). Затем он использует gsub для удаления периодов в пределах этого. (Если бы это было желательно удалить только первый период в пределах подстроки затем изменить gsub к sub.)

library(gsubfn) 
gsubfn("^[^,]*", ~ gsub("\\.", "", x), xx) 

Результат:

[1] "fefe3 fregg, ff, 34.gr. trgw" 
[2] "fefe3 fregg, ff, 34.gr. trgw" 
[3] "fefe3 fregg, ff, 34.gr. tr.gw" 
+0

Спасибо, что 'gsubfn' интригует! – Ben

1

Я не знаю, о скорости или количества печатая но вот подход с использованием beg2char и char2end функции qdap в:

## xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
##  "fefe3. fregg, ff, 34.gr. trgw", 
##  "fefe3 fregg, ff, 34.gr. tr.gw") 

library(qdap) 

paste0(gsub("\\.", "", beg2char(xx, ",")), char2end(xx, ",", include=TRUE)) 

## > paste0(gsub("\\.", "", beg2char(xx, ",")), char2end(xx, ",", include=TRUE)) 
## [1] "fefe3 fregg, ff, 34.gr. trgw" "fefe3 fregg, ff, 34.gr. trgw" 
## [3] "fefe3 fregg, ff, 34.gr. tr.gw" 
+0

Спасибо, это решение, безусловно, самый легкий для меня, чтобы понять. – Ben

Смежные вопросы