Удалить часть строки


90

Как удалить часть строки? Например, ATGAS_1121я хочу удалить все раньше _.

Ответы:


133

Используйте регулярные выражения. В этом случае можно использовать gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Это регулярное выражение соответствует началу строки (^), любому символу (.), Повторяющемуся ноль или более раз (*), и подчеркиванию (_). ? делает совпадение "ленивым", так что только совпадения заканчиваются до первого символа подчеркивания. Это совпадение заменяется подчеркиванием. См. ?regexДополнительные сведения и ссылки


6
Предыдущее регулярное выражение будет соответствовать к последнему подчеркиванию в случае, например, gsub("^.*_","_","ATGAS_1121_xxx"). Теперь исправлено.
Richie Cotton

7
@Joshua Я считаю очень полезным, что вы объяснили роль регулярных выражений.
Василий

Это также работает с вектором строк в качестве последнего аргумента. R такой классный.
naught101

37

Вы можете использовать для этого встроенный strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit возвращает обе части строки, проанализированной в параметре разделения, в виде списка . Вероятно, это не то, что вам нужно, поэтому оберните вызов в unlist , а затем проиндексируйте этот массив, чтобы возвращался только второй из двух элементов в векторе.

Наконец, для параметра fixed следует установить значение TRUE, чтобы указать, что параметр разделения не является регулярным выражением, а является буквальным совпадающим символом.


23

Если вы человек типа Tidyverse, вот решение для стрингера :

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

Вот strsplitрешение, если sэто вектор:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
Очень полезно, спасибо! FYI, чтобы получить первую часть строки (то есть перед '_'), замените [2] в конце на [1].
stevenjoe 06

4

Возможно, наиболее интуитивно понятным решением будет использование stringrфункции, str_removeкоторая даже проще, чем str_replaceу нее только 1 аргумент вместо 2.

Единственная сложность в вашем примере заключается в том, что вы хотите сохранить подчеркивание, но это возможно: вы должны сопоставлять регулярное выражение, пока оно не найдет указанный шаблон строки (?=pattern).

См. Пример:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

Здесь strsplitрешение для фрейма данных с использованием dplyrпакета

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.