Видаліть частину рядка


90

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

Відповіді:


131

Використовуйте регулярні вирази. У цьому випадку ви можете використовувати gsub:

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

Цей регулярний вираз відповідає початку рядка (^), будь-якому символу (.), Що повторюється нуль або більше разів (*), і підкресленням (_). ? робить матч «лінивим», так що він відповідає лише першим підкресленням. Цей матч замінюється лише підкресленням. Див ?regexбільш детальної інформації та посилання


6
Попереднє регулярний вираз буде відповідати до останнього підкреслення в разі, наприклад, gsub("^.*_","_","ATGAS_1121_xxx"). Зараз виправлено
Річі Коттон,

7
@Joshua Я вважаю дуже корисним те, що ви пояснили роль регулярних виразів.
Василе

Це також працює з вектором рядків як останнім аргументом. R чудовий такий.
naught101

37

Ви можете використовувати вбудований для цього, strsplit :

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

strsplit повертає обидва фрагменти рядка, проаналізовані за параметром split, як список . Це, ймовірно , не те , що ви хочете, так обернути виклик в unlist , то індекс , що масив так , що тільки другий з двох елементів у векторі повертаються.

Нарешті, фіксованому параметру слід встановити значення TRUE, щоб вказати, що параметр split - це не регулярний вираз, а буквальний відповідний символ.


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

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.