Как заменить шаблон кроме определенного шаблона другим шаблоном в столбце? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть фрейм данных (x) со столбцом "Symbol", который я хочу заменить (все "- *" на ""), но я не хочу изменять некоторые значения, такие как: 1-Mar, 1-Сентябрь, 1 декабря, ...

x<-data.frame("ID"=c("a","b","c","d","e","f","g","h","i"),"Symbol"=c("3-Mar","STON1-GTF2A1L","1-Dec","NME1-NME2","12-Mar","TNFSF12-TNFSF13","8-Mar","TMEM189-UBE2V1","10-Sep"))

Я попробовал этот код: x$Symbol<-gsub ("-*", "", x$Symbol) Но он меняется (1 марта, 1 сентября, 1 декабря)

Мне нужноприведенный ниже кадр данных

x<-data.frame("ID"=c("a","b","c","d","e","f","g","h","i"),"Symbol"=c("3-Mar","STON1","1-Dec","NME1","12-Mar","TNFSF12","8-Mar","TMEM189","10-Sep"))

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете paste "18" в Symbol и посмотреть, анализирует ли он Date и sub значения, не являющиеся датами.

df$Symbol <- with(df, ifelse(is.na(as.Date(paste0(Symbol, "-18"), "%d-%b-%y")), 
                   sub ("-.*", "", Symbol), Symbol))

df
#  ID  Symbol
#1  a   3-Mar
#2  b   STON1
#3  c   1-Dec
#4  d    NME1
#5  e  12-Mar
#6  f TNFSF12
#7  g   8-Mar
#8  h TMEM189
#9  i  10-Sep

Первый запуск

df$Symbol <- as.character(df$Symbol)

для преобразования Symbol в символы.

0 голосов
/ 05 февраля 2019

Вы можете использовать

x$Symbol <- sub("-(?!(?:Jan|Feb|Mar|Apr|May|Ju[nl]|Aug|Sep|Oct|Nov|Dec)$).*", "", x$Symbol, perl=TRUE)

См. Демоверсию regex

Подробности

  • -- дефис
  • (?!(?:Jan|Feb|Mar|Apr|May|Ju[nl]|Aug|Sep|Oct|Nov|Dec)$) - отрицательный прогноз, который не соответствует совпадению, если непосредственно справа от текущего местоположения есть сокращенное название месяца в конце строки ( ПРИМЕЧАНИЕ : если после имени месяца у вас может быть еще какой-либо текст, используйте (?!(?:Jan|Feb|Mar|Apr|May|Ju[nl]|Aug|Sep|Oct|Nov|Dec)\\b) (чтобы сопоставить названия месяцев как целые слова) или (?!Jan|Feb|Mar|Apr|May|Ju[nl]|Aug|Sep|Oct|Nov|Dec), чтобы просто сопоставить имена как неограниченные подстроки)
  • .*- любые 0+ символов, кроме символов разрыва строки, как можно больше.

R демо :

df<-data.frame("ID"=c("a","b","c","d","e","f","g","h","i"),"Symbol"=c("3-Mar","STON1-GTF2A1L","1-Dec","NME1-NME2","12-Mar","TNFSF12-TNFSF13","8-Mar","TMEM189-UBE2V1","10-Sep"))
df$Symbol <- sub("-(?!(?:Jan|Feb|Mar|Apr|May|Ju[nl]|Aug|Sep|Oct|Nov|Dec)$).*", "", df$Symbol, perl=TRUE)
df

Вывод:

  ID  Symbol
1  a   3-Mar
2  b   STON1
3  c   1-Dec
4  d    NME1
5  e  12-Mar
6  f TNFSF12
7  g   8-Mar
8  h TMEM189
9  i  10-Sep
...