Строка gsub перед несколькими символами вместе в R - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь скопировать строку перед несколькими символами в столбце вместе в R. Позвольте мне объяснить на примере

data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"

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

data <- data.frame(c("a-b","b-c","c-d"))
colnames(data) <- "ABC"

Я делаю это:

if(any(grepl(":|_", data$ABC))){
      data$ABC <- gsub(".*_", "", data$ABC)
    } 

Я пытался использовать трубу "|" добавить еще одно условие, например:

if(any(grepl(":|_", data$ABC))){
      data$ABC <- gsub(".*_"|".*:", "", data$ABC)
    } 

Но это не работает. Есть ли способ сделать это за один шаг? Кроме того, я должен проверить, есть ли в столбце эти символы или нет, таким образом, grepl.

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Вы можете использовать следующее регулярное выражение, если вам нужно удалить до последнего _ или ::

sub(".*[_:]\\s*", "", data$ABC)

Или, если вам нужно удалить до первого _ или ::

sub(".*?[_:]\\s*", "", data$ABC)

Детали шаблона :

  • .*? - любые 0+ символов, как можно меньше (.* соответствует 0 или более символам как можно больше)
  • [_:] - _ или :
  • \s* - 0+ пробелов.

См. Демонстрационную версию regex и демонстрационную версию R :

data <- data.frame(c("1_a-b","2: b-c","3_c-d"))
colnames(data) <- "ABC"
if(any(grepl(":|_", data$ABC))){
   data$ABC <- sub(".*[_:]\\s*", "", data$ABC)
} 

Выход data:

  ABC
1 a-b
2 b-c
3 c-d
0 голосов
/ 10 мая 2019

Как насчет использования пакета stringr?

library(stringr)
df %>% 
  mutate(
    ABC = as.character(ABC),
    new = if_else(
      str_detect(ABC, "\\w\\-\\w"),
      str_extract(ABC, "\\w\\-\\w"),
      ABC
    )
  )

     ABC new
1  1_a-b a-b
2 2: b-c b-c
3  3_c-d c-d

Изменено включение оператора if-else - пропущено то, что вы заинтересованы в проверке этой последовательности.

...